chore(release): promote staging to production for v1.3.0 - #888
Merged
Conversation
test_get_project_area assumed its "Test Group Foo" fixture would always get database id 1, which only held because nothing else in the suite created a Group row first. Any earlier-running test that inserts a Group (e.g. a data-migration test) shifts the sequence and breaks this test with an unrelated 404. Use the fixture's actual group.id instead of the literal 1.
pyproject.toml's explicit setuptools packages list omitted data_migrations, so the installed `oco` CLI couldn't import it at all -- `oco data-migrations status/run` failed with ModuleNotFoundError for every migration, not just new ones. Running via `uv run pytest`/`python -c` masked this because pytest prepends the repo root to sys.path; the installed console-script entry point does not.
The upcoming ogc_* view filter excludes non-public records, and nine currently-passing tests in test_ogc.py assert that rows backed by the shared location/water_well_thing/group fixtures ARE present in ogc_* responses. Their "draft" default was an arbitrary safe value, not a deliberate test input -- confirmed by grepping the suite for anything that depends on it being specifically "draft". Flips the three fixtures plus one inline Group(...)construction in test_ogc.py that bypassed the fixture.
Every ogc_* view/materialized view selected release_status but never filtered on it, so the unauthenticated /ogcapi endpoints have been serving private and draft records alongside public ones (e.g. water_wells: 1,145 private + 140 draft rows next to 8,678 public). Adds "AND release_status = 'public'" to all 21 existing ogc_* relations and introduces ogc_locations (previously the locations collection pointed straight at the raw location table, which has no filter at all). ogc_actively_monitored_wells gets no predicate of its own -- it already inherits public-only rows transitively through its join to ogc_water_well_summary; adding a redundant filter on status_history.release_status would repeat a mistake already made and reverted once (see w1x2y3z4a5b6), since that column is never populated by the transfer scripts. Fully reversible: downgrade() rebuilds the same relations with the byte-identical unfiltered SQL that was in production before this migration (ogc_locations is the exception, since it didn't exist pre-migration -- downgrade drops it rather than recreating it unfiltered). Repoints core/pygeoapi-config.yml's locations provider at the new view in the same commit, since shipping the view without the config change (or vice versa) leaves the collection either unfiltered or broken. Layer visibility (which collections are published)is unchanged. That's separate, out-of-scope work.
ogc_project_areas is now filtered to public records, but all 56 current project_area-bearing group rows are release_status=draft (confirmed in docs/ogc-layer-audit.md), which would make the layer return zero rows until someone flips them. Uses the data_migrations framework (not Alembic, which is schema-only in this repo) so the change is tracked, skip-if-applied, and gated on this ticket's schema revision having landed first. Runs independently via `oco data-migrations run 20260714_0001_publish_project_areas` -- deliberately not swept in via run-all, which could also apply other unrelated pending migrations. No downgrade: this framework is forward-only, and a blanket revert couldn't tell rows this migration published apart from ones published independently afterward -- undoing it later means writing a new, deliberate migration instead. This is a genuine publication decision, not a mechanical schema change -- confirm the 56 rows are actually appropriate for public release before merging.
Covers the migration-application, downgrade-reversibility, already-consistent-layers, and project_areas scenarios in ogc-cleanup-sprint1.feature tagged @A1. The other ~10 tickets sharing that feature file have no steps yet and stay undefined, per plan. Tags @production only on these specific scenarios (the feature file has no feature-level tag since ~20 other tickets' scenarios share it) and @migration-mutates-schema on the three that call alembic downgrade, wiring a before/after_scenario hook in environment.py that unconditionally restores head so a downgrade left mid-scenario can't leak into later scenarios sharing this database.
pygeoapi is mounted via a raw Starlette Mount, so FastAPI's Depends() machinery never runs for it -- auth has to happen at the ASGI layer, in front of the mount, not as a route dependency. Added TokenInvalid and decode_token_payload() alongside the existing _get_token_payload so the same JWKS/jwt.decode logic can be reused from code with no FastAPI exception handler watching (raising HTTPException there would just be an unhandled exception, not a response). InternalOGCAuthMiddleware is a plain ASGI middleware class rather than BaseHTTPMiddleware (used elsewhere in this app for request logging and lazy admin init): BaseHTTPMiddleware buffers the full response body and breaks client-disconnect propagation, which matters here since this mount serves paginated GeoJSON up to max_items: 10000. Splits 401 (no/invalid token) from 403 (valid token, wrong group) per the acceptance criteria, rather than collapsing both into 401 like every other auth path in this app does today -- the underlying check is identical either way, so the split is a one-line branch, not meaningfully more code to maintain.
Generalized _mount_path()/_pygeoapi_dir()/_write_config() to take an env var and default rather than hardcoding the public mount's values, so the internal mount gets the same traversal/character safety and sensitive-file handling for free instead of a copy-pasted second implementation. mount_pygeoapi_internal() gets its own guard flag and runtime dir so it can't silently no-op against the public mount's state, and a startup check that the two configured mount paths actually differ -- Starlette doesn't error on duplicate Mounts, it just routes to whichever registered first, which would leave the internal mount silently unreachable rather than failing loudly. Also added _assert_server_settings_match(): pygeoapi.api.API mutates process-wide globals (CHARSET, FORMAT_TYPES) during __init__, so whichever of the two mounts is built last wins for both. Inert today since both configs agree on encoding/gzip, but this fails startup loudly instead of letting a future divergence between the two configs silently corrupt responses on whichever mount lost the race.
Mirrors all 22 ogc_* relations f4a5b6c7d8e9 filters, as ogc_internal_* counterparts with no release_status predicate, so /ogcapi-internal can serve private/draft records to authenticated staff. Reuses f4a5b6c7d8e9's parametrized builder functions (public_only kept in the signature and always passed False) for structural parity rather than a differently-shaped rewrite, since that's what the drift-detection test in the next commit diffs against. This repo keeps migrations self-contained with no cross-migration imports, so the two chemistry views' analyte-mapping CASE blocks are duplicated here rather than shared via a helper module -- a shared module would mean a future edit to one ticket's migration silently changes what the other replays from scratch. Added a one-line cross-reference comment in both files pointing at each other and the parity test. ogc_internal_locations has no release_status predicate at all (unlike ogc_locations, which is always public-only even on its own downgrade path) since it never existed in any filtered form before this migration. downgrade() simply drops all 22 relations rather than restoring a prior state, since none of them existed before this migration.
The major/minor chemistry CASE blocks now exist in two files (f4a5b6c7d8e9 and 2d3c3a268652) because migrations can't import from each other. Without a check, a future analyte-mapping fix applied to the public view (e.g. reported against a public-facing bug) has no reason to also touch the internal view sitting in a different file from a different ticket -- silently leaving internal staff looking at the stale mapping, which inverts who has the more reliable data. Compares AST source segments rather than raw text/regex so the comparison survives incidental formatting differences and only fails on a genuine logic change. Normalizes the one expected difference (the view name embedded in the CREATE statement) before comparing.
Tags the 6 A11 scenarios A1 already wrote into this shared feature file with @production, appended to their existing tag lines rather than at the feature level -- this file has no feature-level tag since it's shared across ~10 other tickets' scenarios, and tagging at that level would pull in every other ticket's undefined steps. The 401/403/200 auth scenarios neutralize the ambient AUTHENTIK_DISABLE_AUTHENTICATION dev-bypass for their own duration only (restored via context.add_cleanup) and patch core.permissions.decode_token_payload directly, since no real Authentik server is available in CI to issue a genuine JWT. Existing auth-testing infrastructure in this repo only reaches app.dependency_overrides, which has zero effect on ASGI middleware -- none of it exercises InternalOGCAuthMiddleware for free.
…to-staging-1.2.0 chore: merge production v1.2.0 into staging
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 8.3.2 to 9.0.0. - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](astral-sh/setup-uv@v8.3.2...v9.0.0) --- updated-dependencies: - dependency-name: astral-sh/setup-uv dependency-version: 9.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
…or-and-patch group (#793) Bumps the gha-minor-and-patch group with 1 update: [actions/checkout](https://github.com/actions/checkout). Updates `actions/checkout` from 7.0.0 to 7.0.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/checkout/releases">actions/checkout's releases</a>.</em></p> <blockquote> <h2>v7.0.1</h2> <h2>What's Changed</h2> <ul> <li>skip running unsafe pr check if input is default by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2518">actions/checkout#2518</a></li> <li>trim only ascii whitespace for branch by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2521">actions/checkout#2521</a></li> <li>escape values passed to --unset by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2530">actions/checkout#2530</a></li> <li>Various dependency updates</li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v7...v7.0.1">https://github.com/actions/checkout/compare/v7...v7.0.1</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/actions/checkout/compare/v7...v7.0.1">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the uv-non-major group with 18 updates: | Package | From | To | | --- | --- | --- | | [aiohttp](https://github.com/aio-libs/aiohttp) | `3.14.1` | `3.14.3` | | [annotated-types](https://github.com/annotated-types/annotated-types) | `0.7.0` | `0.8.0` | | [cachetools](https://github.com/tkem/cachetools) | `7.1.4` | `7.1.6` | | [certifi](https://github.com/certifi/python-certifi) | `2026.6.17` | `2026.7.22` | | [cloud-sql-python-connector](https://github.com/GoogleCloudPlatform/cloud-sql-python-connector) | `1.20.4` | `1.21.0` | | [fastapi](https://github.com/fastapi/fastapi) | `0.139.2` | `0.140.2` | | [google-api-core](https://github.com/googleapis/google-cloud-python) | `2.32.0` | `2.33.0` | | [google-auth](https://github.com/googleapis/google-cloud-python) | `2.56.0` | `2.56.2` | | [greenlet](https://github.com/python-greenlet/greenlet) | `3.5.3` | `3.5.4` | | [phonenumbers](https://github.com/daviddrysdale/python-phonenumbers) | `9.0.34` | `9.0.35` | | [proto-plus](https://github.com/googleapis/google-cloud-python) | `1.28.1` | `1.28.2` | | [pytz](https://github.com/stub42/pytz) | `2026.2` | `2026.3.post1` | | [scramp](https://github.com/tlocke/scramp) | `1.4.12` | `1.4.15` | | [sentry-sdk[fastapi]](https://github.com/getsentry/sentry-python) | `2.66.0` | `2.66.1` | | [pre-commit](https://github.com/pre-commit/pre-commit) | `4.6.0` | `4.6.1` | | [google-api-python-client](https://github.com/googleapis/google-api-python-client) | `2.184.0` | `2.198.0` | | [filelock](https://github.com/tox-dev/py-filelock) | `3.31.1` | `3.32.0` | | [sentry-sdk](https://github.com/getsentry/sentry-python) | `2.66.0` | `2.66.1` | Updates `aiohttp` from 3.14.1 to 3.14.3 Updates `annotated-types` from 0.7.0 to 0.8.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/annotated-types/annotated-types/releases">annotated-types's releases</a>.</em></p> <blockquote> <h2>v0.8.0</h2> <h2>What's Changed</h2> <ul> <li>Rename DocInfo to Doc by <a href="https://github.com/zen-xu"><code>@zen-xu</code></a> in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/80">annotated-types/annotated-types#80</a></li> <li>Add support for Python 3.13 by <a href="https://github.com/hugovk"><code>@hugovk</code></a> in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/83">annotated-types/annotated-types#83</a></li> <li>Fix docstring of <code>Timezone</code> by <a href="https://github.com/Viicos"><code>@Viicos</code></a> in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/84">annotated-types/annotated-types#84</a></li> <li>Update license-files to be PEP-639 compliant (<a href="https://redirect.github.com/annotated-types/annotated-types/issues/85">#85</a>) by <a href="https://github.com/shoeffner"><code>@shoeffner</code></a> in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/86">annotated-types/annotated-types#86</a></li> <li>fix: typo in README.md by <a href="https://github.com/camiloaz"><code>@camiloaz</code></a> in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/87">annotated-types/annotated-types#87</a></li> <li>add CI for PyPy3.11 and fix test (issue 71) by <a href="https://github.com/mattip"><code>@mattip</code></a> in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/88">annotated-types/annotated-types#88</a></li> <li>Fix string predicate names in doc by <a href="https://github.com/leogermond"><code>@leogermond</code></a> in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/90">annotated-types/annotated-types#90</a></li> <li>Add SPDX license expression by <a href="https://github.com/wichert"><code>@wichert</code></a> in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/92">annotated-types/annotated-types#92</a></li> <li>Added Python 3.14 to the test matrix by <a href="https://github.com/imtoopunkforyou"><code>@imtoopunkforyou</code></a> in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/96">annotated-types/annotated-types#96</a></li> <li>Add support for Python 3.14 and drop EOL 3.8-3.9 by <a href="https://github.com/hugovk"><code>@hugovk</code></a> in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/97">annotated-types/annotated-types#97</a></li> <li>Fix typo in <code>Len</code> docstring by <a href="https://github.com/Dutcho"><code>@Dutcho</code></a> in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/100">annotated-types/annotated-types#100</a></li> <li>Prepare for 0.8.0 release by <a href="https://github.com/adriangb"><code>@adriangb</code></a> in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/103">annotated-types/annotated-types#103</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/zen-xu"><code>@zen-xu</code></a> made their first contribution in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/80">annotated-types/annotated-types#80</a></li> <li><a href="https://github.com/hugovk"><code>@hugovk</code></a> made their first contribution in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/83">annotated-types/annotated-types#83</a></li> <li><a href="https://github.com/shoeffner"><code>@shoeffner</code></a> made their first contribution in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/86">annotated-types/annotated-types#86</a></li> <li><a href="https://github.com/camiloaz"><code>@camiloaz</code></a> made their first contribution in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/87">annotated-types/annotated-types#87</a></li> <li><a href="https://github.com/mattip"><code>@mattip</code></a> made their first contribution in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/88">annotated-types/annotated-types#88</a></li> <li><a href="https://github.com/leogermond"><code>@leogermond</code></a> made their first contribution in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/90">annotated-types/annotated-types#90</a></li> <li><a href="https://github.com/wichert"><code>@wichert</code></a> made their first contribution in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/92">annotated-types/annotated-types#92</a></li> <li><a href="https://github.com/imtoopunkforyou"><code>@imtoopunkforyou</code></a> made their first contribution in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/96">annotated-types/annotated-types#96</a></li> <li><a href="https://github.com/Dutcho"><code>@Dutcho</code></a> made their first contribution in <a href="https://redirect.github.com/annotated-types/annotated-types/pull/100">annotated-types/annotated-types#100</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/annotated-types/annotated-types/compare/v0.7.0...v0.8.0">https://github.com/annotated-types/annotated-types/compare/v0.7.0...v0.8.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/annotated-types/annotated-types/commit/9eb96680138269811a39d838d720abc3dce33954"><code>9eb9668</code></a> Prepare for 0.8.0 release (<a href="https://redirect.github.com/annotated-types/annotated-types/issues/103">#103</a>)</li> <li><a href="https://github.com/annotated-types/annotated-types/commit/10b77644f88b385357653730a1ab23748ca3ae2e"><code>10b7764</code></a> Fix typo in <code>Len</code> docstring (<a href="https://redirect.github.com/annotated-types/annotated-types/issues/100">#100</a>)</li> <li><a href="https://github.com/annotated-types/annotated-types/commit/955f7576d616feb6e9407c74498517787c38afd4"><code>955f757</code></a> Add support for Python 3.14 and drop EOL 3.8-3.9 (<a href="https://redirect.github.com/annotated-types/annotated-types/issues/97">#97</a>)</li> <li><a href="https://github.com/annotated-types/annotated-types/commit/bd280fea7983550d266f993d868b8dd7ff822bf1"><code>bd280fe</code></a> Added Python 3.14 to the test matrix (<a href="https://redirect.github.com/annotated-types/annotated-types/issues/96">#96</a>)</li> <li><a href="https://github.com/annotated-types/annotated-types/commit/a471bb757663452459893e6f593118ec21eb1b9e"><code>a471bb7</code></a> Add SPDX license expression (<a href="https://redirect.github.com/annotated-types/annotated-types/issues/92">#92</a>)</li> <li><a href="https://github.com/annotated-types/annotated-types/commit/eab91d9a8c0d3f73661fc4b0794a1fe76c94fa84"><code>eab91d9</code></a> Fix string predicate names in doc (<a href="https://redirect.github.com/annotated-types/annotated-types/issues/90">#90</a>)</li> <li><a href="https://github.com/annotated-types/annotated-types/commit/03ad9c3c7b4d4dfe9e33c09075a3a2766c0820e1"><code>03ad9c3</code></a> add CI for PyPy3.11 and fix test (issue 71) (<a href="https://redirect.github.com/annotated-types/annotated-types/issues/88">#88</a>)</li> <li><a href="https://github.com/annotated-types/annotated-types/commit/5ae60437f0ab493cedd27311bc6ce6d2188e8d8b"><code>5ae6043</code></a> fix: typo in README.md (<a href="https://redirect.github.com/annotated-types/annotated-types/issues/87">#87</a>)</li> <li><a href="https://github.com/annotated-types/annotated-types/commit/b60ad7bff90019c7de3547df1c8e3586eb328423"><code>b60ad7b</code></a> Update license-files to be PEP-639 compliant (<a href="https://redirect.github.com/annotated-types/annotated-types/issues/85">#85</a>) (<a href="https://redirect.github.com/annotated-types/annotated-types/issues/86">#86</a>)</li> <li><a href="https://github.com/annotated-types/annotated-types/commit/3fbeb6d129760ae48d7a0372fb9301764acc95ae"><code>3fbeb6d</code></a> Fix docstring of <code>Timezone</code> (<a href="https://redirect.github.com/annotated-types/annotated-types/issues/84">#84</a>)</li> <li>Additional commits viewable in <a href="https://github.com/annotated-types/annotated-types/compare/v0.7.0...v0.8.0">compare view</a></li> </ul> </details> <br /> Updates `cachetools` from 7.1.4 to 7.1.6 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst">cachetools's changelog</a>.</em></p> <blockquote> <h1>v7.1.6 (2026-07-24)</h1> <ul> <li>Minor style improvements to keep <code>ruff</code> happy.</li> </ul> <h1>v7.1.5 (2026-07-23)</h1> <ul> <li> <p>Fix <code>TLRUCache</code> silently keeping stale values on expired overwrites.</p> </li> <li> <p>Reject negative cache item <code>getsizeof</code> values.</p> </li> <li> <p>Update build environment.</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/tkem/cachetools/commit/13bb86a55e36e501cf0b3e4c35db516ed9409fd7"><code>13bb86a</code></a> Minor style improvements to keep ruff happy.</li> <li><a href="https://github.com/tkem/cachetools/commit/e2250be46b9d8ed76b82c1c18a4465c0b1167b8a"><code>e2250be</code></a> Fix RTD version handling.</li> <li><a href="https://github.com/tkem/cachetools/commit/0d2a6ea17b3627bcf334c7360a8abe5889dd6235"><code>0d2a6ea</code></a> Release v7.1.5.</li> <li><a href="https://github.com/tkem/cachetools/commit/d64cf805de3c35feac4d2acc0d9d092bd9afd77e"><code>d64cf80</code></a> Prepare v7.1.5.</li> <li><a href="https://github.com/tkem/cachetools/commit/fcbb0de97fc09de646d2e210def765d07dee66e8"><code>fcbb0de</code></a> Fix <a href="https://redirect.github.com/tkem/cachetools/issues/406">#406</a>: Merge branch 'gaoflow-fix-tlru-overwrite-expired-stale-value' into ...</li> <li><a href="https://github.com/tkem/cachetools/commit/c0fdf6abab38040947d6fe2e38c507401d5e2350"><code>c0fdf6a</code></a> Fix TLRUCache silently keeping stale value on expired overwrite</li> <li><a href="https://github.com/tkem/cachetools/commit/978d34d40cdbf3b4cbfce104f3166032cc4ea028"><code>978d34d</code></a> Bump actions/setup-python from 6.2.0 to 6.3.0</li> <li><a href="https://github.com/tkem/cachetools/commit/d5c7eea7e52d18fed0ec1b575db1956b1d035782"><code>d5c7eea</code></a> Reject negative cache item sizes</li> <li><a href="https://github.com/tkem/cachetools/commit/578e97648dd312880f8aea172437c6dd424d0028"><code>578e976</code></a> Update build environment.</li> <li><a href="https://github.com/tkem/cachetools/commit/e164b7020e4211b57d20fe2b252d931af6244ad4"><code>e164b70</code></a> Bump codecov/codecov-action from 6.0.0 to 7.0.0</li> <li>Additional commits viewable in <a href="https://github.com/tkem/cachetools/compare/v7.1.4...v7.1.6">compare view</a></li> </ul> </details> <br /> Updates `certifi` from 2026.6.17 to 2026.7.22 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/certifi/python-certifi/commit/f4bc676bc101fe2235846e37044e8c693d6cbaf4"><code>f4bc676</code></a> 2026.07.22 (<a href="https://redirect.github.com/certifi/python-certifi/issues/428">#428</a>)</li> <li><a href="https://github.com/certifi/python-certifi/commit/4c91f9c5f9b4676d40d2930025ba04d80dd536f6"><code>4c91f9c</code></a> Bump actions/setup-python from 6.3.0 to 7.0.0 (<a href="https://redirect.github.com/certifi/python-certifi/issues/427">#427</a>)</li> <li><a href="https://github.com/certifi/python-certifi/commit/01a66c5cf32eadb8f03a0504c24cb44f6d581248"><code>01a66c5</code></a> Bump actions/checkout from 7.0.0 to 7.0.1 (<a href="https://redirect.github.com/certifi/python-certifi/issues/426">#426</a>)</li> <li><a href="https://github.com/certifi/python-certifi/commit/eb355f41cb71f71012ecf1a4d27a57d0ee2b1337"><code>eb355f4</code></a> Bump pypa/gh-action-pypi-publish from 1.14.0 to 1.14.1 (<a href="https://redirect.github.com/certifi/python-certifi/issues/425">#425</a>)</li> <li><a href="https://github.com/certifi/python-certifi/commit/474e6fc996d55b91632248da0bade702504e62dc"><code>474e6fc</code></a> Include tests in the source distribution (<a href="https://redirect.github.com/certifi/python-certifi/issues/424">#424</a>)</li> <li><a href="https://github.com/certifi/python-certifi/commit/a31ef39bb5906af7dc9729890f7e4e04e75afdae"><code>a31ef39</code></a> Bump actions/setup-python from 6.2.0 to 6.3.0 (<a href="https://redirect.github.com/certifi/python-certifi/issues/420">#420</a>)</li> <li><a href="https://github.com/certifi/python-certifi/commit/98eb2c76a9c7a8519912023dca00f762bbcd59af"><code>98eb2c7</code></a> Bump actions/checkout from 6.0.3 to 7.0.0 (<a href="https://redirect.github.com/certifi/python-certifi/issues/419">#419</a>)</li> <li>See full diff in <a href="https://github.com/certifi/python-certifi/compare/2026.06.17...2026.07.22">compare view</a></li> </ul> </details> <br /> Updates `cloud-sql-python-connector` from 1.20.4 to 1.21.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/releases">cloud-sql-python-connector's releases</a>.</em></p> <blockquote> <h2>v1.21.0</h2> <h2><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/compare/v1.20.4...v1.21.0">1.21.0</a> (2026-07-23)</h2> <h3>Features</h3> <ul> <li>Add PSC DNS and Global Write Endpoint support to Python Connector (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1424">#1424</a>) (<a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/b34e9c643017823e579e20eb47222f5ff510bf5e">b34e9c6</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li>update python dependencies (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1443">#1443</a>) (<a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2adc5157bda4b0bdea75687c2e511fa03be0bc3e">2adc515</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/blob/main/CHANGELOG.md">cloud-sql-python-connector's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/compare/v1.20.4...v1.21.0">1.21.0</a> (2026-07-23)</h2> <h3>Features</h3> <ul> <li>Add PSC DNS and Global Write Endpoint support to Python Connector (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1424">#1424</a>) (<a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/b34e9c643017823e579e20eb47222f5ff510bf5e">b34e9c6</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li>update python dependencies (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1443">#1443</a>) (<a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2adc5157bda4b0bdea75687c2e511fa03be0bc3e">2adc515</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/bcc1cbf7cd7f4f94ebcf9aed821d9816b55ea3c9"><code>bcc1cbf</code></a> chore(main): release 1.21.0 (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1444">#1444</a>)</li> <li><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/b34e9c643017823e579e20eb47222f5ff510bf5e"><code>b34e9c6</code></a> feat: Add PSC DNS and Global Write Endpoint support to Python Connector (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1424">#1424</a>)</li> <li><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/53b3bcad84d238b74e9a46501d781a10818e0bd3"><code>53b3bca</code></a> chore: add venv helper and grpc dependencies (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1445">#1445</a>)</li> <li><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2adc5157bda4b0bdea75687c2e511fa03be0bc3e"><code>2adc515</code></a> fix: update python dependencies (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1443">#1443</a>)</li> <li><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/4baeb6f1d048c41828467ddca57930c7ae72c623"><code>4baeb6f</code></a> refactor: replace aiofiles with asyncio.to_thread (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1437">#1437</a>)</li> <li>See full diff in <a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/compare/v1.20.4...v1.21.0">compare view</a></li> </ul> </details> <br /> Updates `fastapi` from 0.139.2 to 0.140.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/fastapi/fastapi/releases">fastapi's releases</a>.</em></p> <blockquote> <h2>0.140.2</h2> <h3>Refactors</h3> <ul> <li>⚡️ Stop retaining flat dependency trees. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/16065">#16065</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> </ul> <h3>Internal</h3> <ul> <li>👷 Add new memory benchmark. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/16064">#16064</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> </ul> <h2>0.140.1</h2> <h3>Refactors</h3> <ul> <li>♻️ Update the lru_cache limit for dependencies to account for large apps. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/16062">#16062</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> </ul> <h2>0.140.0</h2> <h3>Refactors</h3> <ul> <li>⚡️ Reduce memory usage in dependencies. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/16049">#16049</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> </ul> <h3>Docs</h3> <ul> <li>📝 Fix links in docs. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15967">#15967</a> by <a href="https://github.com/YuriiMotov"><code>@YuriiMotov</code></a>.</li> <li>📝 Add Library Skills documentation. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/16041">#16041</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>📝 Update docs to use uv projects by default. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/16032">#16032</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>📝 Restructure FastAPI People and related pages. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/16015">#16015</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> </ul> <h3>Internal</h3> <ul> <li>👷 Add CI memory benchmark. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/16046">#16046</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>👥 Update FastAPI People - Sponsors. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/16027">#16027</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🔥 Remove now-obsolete scripts to generate data for FastAPI People. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/16016">#16016</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/fastapi/fastapi/commit/051dfeddcc1531037e23f928197a553c8732090c"><code>051dfed</code></a> 🔖 Release version 0.140.2 (<a href="https://redirect.github.com/fastapi/fastapi/issues/16066">#16066</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/e9980492f2d35ea309bc2dea54a2836aae0a4dc4"><code>e998049</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/8069eadf5e12235bcbbdd2d3bafe5226c585e997"><code>8069ead</code></a> ⚡️ Stop retaining flat dependency trees (<a href="https://redirect.github.com/fastapi/fastapi/issues/16065">#16065</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/2b4349d6c24326665423ce6819b402f0267cb9b9"><code>2b4349d</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/2f34b90742e4afd2df61e30a721ef01a41a59cfb"><code>2f34b90</code></a> 👷 Add new memory benchmark (<a href="https://redirect.github.com/fastapi/fastapi/issues/16064">#16064</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/3e310c90faa5e580ac9b21abd4e9d027f2e28d0c"><code>3e310c9</code></a> 🔖 Release version 0.140.1 (<a href="https://redirect.github.com/fastapi/fastapi/issues/16063">#16063</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/43eafc6a282c28cf44e53829d65d441f05deefd8"><code>43eafc6</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/65ef53ae6ac110ae7d56f81a7723e58ab319f339"><code>65ef53a</code></a> ♻️ Update the lru_cache limit for dependencies to account for large apps (<a href="https://redirect.github.com/fastapi/fastapi/issues/16">#16</a>...</li> <li><a href="https://github.com/fastapi/fastapi/commit/255b912928904e3ba5980425a54d6837c8bd1a1c"><code>255b912</code></a> 🔖 Release version 0.140.0 (<a href="https://redirect.github.com/fastapi/fastapi/issues/16050">#16050</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/892eacd27dcdcfe6c5ea114543ff473cbbfd7c6f"><code>892eacd</code></a> 📝 Update release notes</li> <li>Additional commits viewable in <a href="https://github.com/fastapi/fastapi/compare/0.139.2...0.140.2">compare view</a></li> </ul> </details> <br /> Updates `google-api-core` from 2.32.0 to 2.33.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/googleapis/google-cloud-python/releases">google-api-core's releases</a>.</em></p> <blockquote> <h2>google-api-core: v2.33.0</h2> <h2><a href="https://github.com/googleapis/google-cloud-python/compare/google-api-core-v2.32.0...google-api-core-v2.33.0">2.33.0</a> (2026-07-22)</h2> <h3>Features</h3> <ul> <li><strong>api_core:</strong> add request-id auto-population logic to gapic_v1 public helpers (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17738">#17738</a>) (<a href="https://github.com/googleapis/google-cloud-python/commit/68e131341bd5d20ee50d7be3ed0410af4c12a46d">68e1313</a>)</li> <li><strong>api-core:</strong> add get_universe_domain helper to universe.py (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17799">#17799</a>) (<a href="https://github.com/googleapis/google-cloud-python/commit/d461da7bde04f2a698469f413116873633aa1f12">d461da7</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>api-core:</strong> prevent overwriting explicit empty strings for optional request_id (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17798">#17798</a>) (<a href="https://github.com/googleapis/google-cloud-python/commit/07f7503437f495dbce19b4f346ea17efcd738a65">07f7503</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/googleapis/google-cloud-python/commit/6702c7ad7b9ecbe53940fc7ce281059a200d7cda"><code>6702c7a</code></a> chore: release main (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17809">#17809</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/6ab2fe1cff28adbaa328fc05c9201061fed8a400"><code>6ab2fe1</code></a> chore(main): release google-cloud-productregistry 0.1.0 (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17806">#17806</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/cc109caf93ddc46b748b7bcebfb952f43fe9b4b1"><code>cc109ca</code></a> chore(main): release google-auth 2.56.2 (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17814">#17814</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/9668675a54ff7644a7524889a5f4af6a4e018a3a"><code>9668675</code></a> chore: update librarian to v0.28.0 (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17811">#17811</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/d4b76faafc7c0a09cda428d39310b0a933e06e73"><code>d4b76fa</code></a> chore(sqlalchemy-bigquery): restore complete coverage (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17770">#17770</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/df0541abf6aae710fc3e6644a5d8f3f706d29c5a"><code>df0541a</code></a> fix(gapic): mock os.path.exists in mTLS tests to support newer google auth (#...</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/1a10e236b26b0e23e5c7d1318ae86c9a1e05ca37"><code>1a10e23</code></a> chore(main): release google-maps-isochrones 0.1.0 (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17804">#17804</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/2a2dc8323278deec735057255f3ade70c8eca039"><code>2a2dc83</code></a> test(bigquery): add debug info to socket leak test (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17802">#17802</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/b2d3fb9521196fd4d9f864f608d791173e0425af"><code>b2d3fb9</code></a> chore(handwritten): centralize mypy configuration and update handwritten pack...</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/2a7d346d54dddf73c1185245c0f89a119bb333ec"><code>2a7d346</code></a> tests: remove protobuf cpp from tests which is no longer used as of Protobuf ...</li> <li>Additional commits viewable in <a href="https://github.com/googleapis/google-cloud-python/compare/google-api-core-v2.32.0...google-api-core-v2.33.0">compare view</a></li> </ul> </details> <br /> Updates `google-auth` from 2.56.0 to 2.56.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/googleapis/google-cloud-python/releases">google-auth's releases</a>.</em></p> <blockquote> <h2>google-auth: v2.56.2</h2> <h2><a href="https://github.com/googleapis/google-cloud-python/compare/google-auth-v2.56.1...google-auth-v2.56.2">2.56.2</a> (2026-07-21)</h2> <h3>Bug Fixes</h3> <ul> <li><strong>auth:</strong> centralize cert discovery logic and steps (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17696">#17696</a>) (<a href="https://github.com/googleapis/google-cloud-python/commit/edc0423e57dd06bef3a93802642a074ab8b7bc5d">edc0423</a>)</li> <li><strong>auth:</strong> exit early when agent cert config is outside well-known directory (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17762">#17762</a>) (<a href="https://github.com/googleapis/google-cloud-python/commit/61e795a8299afec863487776c8a679adbb2911ab">61e795a</a>)</li> <li><strong>transport:</strong> propagate mTLS adapter to auth session and fix connection leaks (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17689">#17689</a>) (<a href="https://github.com/googleapis/google-cloud-python/commit/8289d328f9a1eb2abb766644e4f6748198679c80">8289d32</a>)</li> <li>update _SERVICE_ACCOUNT_EMAIL_PATTERN to require .gserviceaccount.com suffix (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17748">#17748</a>) (<a href="https://github.com/googleapis/google-cloud-python/commit/b60bb04a73eb35b15320c54bc3493132e6ba5706">b60bb04</a>)</li> </ul> <h2>google-auth: v2.56.1</h2> <h2><a href="https://github.com/googleapis/google-cloud-python/compare/google-auth-v2.56.0...google-auth-v2.56.1">2.56.1</a> (2026-07-17)</h2> <h3>Bug Fixes</h3> <ul> <li>disable RAB lookup for Domain-Wide Delegation (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17763">#17763</a>) (<a href="https://github.com/googleapis/google-cloud-python/commit/00eb1284fb6081cd37b747d09366568490a6d9ad">00eb128</a>), closes <a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17703">#17703</a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/googleapis/google-cloud-python/commit/cc109caf93ddc46b748b7bcebfb952f43fe9b4b1"><code>cc109ca</code></a> chore(main): release google-auth 2.56.2 (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17814">#17814</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/d4b76faafc7c0a09cda428d39310b0a933e06e73"><code>d4b76fa</code></a> chore(sqlalchemy-bigquery): restore complete coverage (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17770">#17770</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/df0541abf6aae710fc3e6644a5d8f3f706d29c5a"><code>df0541a</code></a> fix(gapic): mock os.path.exists in mTLS tests to support newer google auth (#...</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/1a10e236b26b0e23e5c7d1318ae86c9a1e05ca37"><code>1a10e23</code></a> chore(main): release google-maps-isochrones 0.1.0 (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17804">#17804</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/2a2dc8323278deec735057255f3ade70c8eca039"><code>2a2dc83</code></a> test(bigquery): add debug info to socket leak test (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17802">#17802</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/b2d3fb9521196fd4d9f864f608d791173e0425af"><code>b2d3fb9</code></a> chore(handwritten): centralize mypy configuration and update handwritten pack...</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/2a7d346d54dddf73c1185245c0f89a119bb333ec"><code>2a7d346</code></a> tests: remove protobuf cpp from tests which is no longer used as of Protobuf ...</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/fb5aada9ed82184025df5994e4f3c5467fd88417"><code>fb5aada</code></a> chore(main): release google-cloud-commerceproducer 0.1.0 (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17805">#17805</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/b60bb04a73eb35b15320c54bc3493132e6ba5706"><code>b60bb04</code></a> fix: update _SERVICE_ACCOUNT_EMAIL_PATTERN to require .gserviceaccount.com ...</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/ed25698a89a92f8ae67167c811d02dd9e5815a7e"><code>ed25698</code></a> tests(sqlalchemy-bigquery): resolve ST function type binding bug (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17769">#17769</a>)</li> <li>Additional commits viewable in <a href="https://github.com/googleapis/google-cloud-python/compare/google-auth-v2.56.0...google-auth-v2.56.2">compare view</a></li> </ul> </details> <br /> Updates `greenlet` from 3.5.3 to 3.5.4 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/python-greenlet/greenlet/blob/master/CHANGES.rst">greenlet's changelog</a>.</em></p> <blockquote> <h1>3.5.4 (2026-07-22)</h1> <ul> <li> <p>Fix a crash (segfault) on free-threaded builds of Python 3.14 and later when the garbage collector runs while a greenlet that was started from a non-empty C-stack-reference state is active. See <code>issue 515 <https://github.com/python-greenlet/greenlet/issues/515></code>_. Thanks to ddorian and Kumar Aditya.</p> </li> <li> <p>Fix a potential use-after-free on free-threaded builds of Python 3.14 and later when the garbage collector runs while a greenlet is suspended holding a <code>_PyCStackRef</code> (for example, mid attribute resolution). See <code>issue 515 <https://github.com/python-greenlet/greenlet/issues/515></code>_. Thanks to ddorian and Kumar Aditya.</p> </li> <li> <p>Fix a deadlock on free-threaded builds when a greenlet switch happened while a <code>PyCriticalSection</code> was held -- for example inside asyncio's <code>Task.__step</code>, which holds one on the running task for the duration of the step. See <code>PR 519 <https://github.com/python-greenlet/greenlet/pull/519/></code>. Thanks to ddorian and Kumar Aditya.</p> </li> </ul> <p>.. note:: Binary 3.15 wheels are now built with Python 3.15b4. These may not be compatible with earlier or later versions of 3.15. Binary 3.15 wheels of greenlet from previous releases (e.g., 3.5.3) may not be compatible with Python 3.15b4.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/python-greenlet/greenlet/commit/384be8821a934fbb835e369dda2b9b72107e80be"><code>384be88</code></a> Preparing release 3.5.4</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/bbdf57b8cccc572639103005bc7dee41d1c309a2"><code>bbdf57b</code></a> Add note to CHANGES about versions of 3.15 binary wheels may/not be compatibl...</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/759902381a85e2ebca2102fab50ffb99b2227a2b"><code>7599023</code></a> Merge pull request <a href="https://redirect.github.com/python-greenlet/greenlet/issues/517">#517</a> from ddorian/issue515-c-stack-refs</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/73a0a1aadf8d45db71754954d588d433fa826a2a"><code>73a0a1a</code></a> Fix the suspended C-stack-ref GC test to catch its regression</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/1ff35f431f768e854db323ae14274044a06d9d12"><code>1ff35f4</code></a> Merge branch 'master' into issue515-c-stack-refs</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/847fb824f6c0590d87963c38c4b2f452a0980b37"><code>847fb82</code></a> Merge pull request <a href="https://redirect.github.com/python-greenlet/greenlet/issues/520">#520</a> from dynapx/fix-test-extension-npd</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/0b471ba66bed12fcf7bef969f26705a30a29a5b4"><code>0b471ba</code></a> Merge pull request <a href="https://redirect.github.com/python-greenlet/greenlet/issues/519">#519</a> from ddorian/freethread-switch-critical-section</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/d55914df27b30af452e63eb2be41fc9b3ec2c982"><code>d55914d</code></a> Simplify the CHANGES.rst entry</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/78932dc67b6571a920751339cfd88056144e8116"><code>78932dc</code></a> Change notes are for end users, they don't need to go into technical detail</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/39bf70c2cb8c8996ce26bc20e4161fd94c05d380"><code>39bf70c</code></a> Hold the C-stack ref snapshot in a std::vector<OwnedObject></li> <li>Additional commits viewable in <a href="https://github.com/python-greenlet/greenlet/compare/3.5.3...3.5.4">compare view</a></li> </ul> </details> <br /> Updates `phonenumbers` from 9.0.34 to 9.0.35 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/daviddrysdale/python-phonenumbers/commit/314e40fdaacc2a6aba3cf4080719a3d518ae438d"><code>314e40f</code></a> Prep for 9.0.35 release</li> <li><a href="https://github.com/daviddrysdale/python-phonenumbers/commit/ba1f5b1ebe3aeec12a2f74d4ebc4c0d77dc1a084"><code>ba1f5b1</code></a> Generated files for metadata</li> <li><a href="https://github.com/daviddrysdale/python-phonenumbers/commit/6245715534a4fd2620463a617508d72bba8f20aa"><code>6245715</code></a> Merge metadata changes from upstream 9.0.35</li> <li>See full diff in <a href="https://github.com/daviddrysdale/python-phonenumbers/compare/v9.0.34...v9.0.35">compare view</a></li> </ul> </details> <br /> Updates `proto-plus` from 1.28.1 to 1.28.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/googleapis/google-cloud-python/releases">proto-plus's releases</a>.</em></p> <blockquote> <h2>proto-plus: v1.28.2</h2> <h2><a href="https://github.com/googleapis/google-cloud-python/compare/proto-plus-v1.28.1...proto-plus-v1.28.2">1.28.2</a> (2026-07-22)</h2> <h3>Bug Fixes</h3> <ul> <li><strong>proto-plus:</strong> make Marshal thread-safe and handle race conditions (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17774">#17774</a>) (<a href="https://github.com/googleapis/google-cloud-python/commit/0719f1ec1d4146dbfc96d24c95b7ccafd31ab447">0719f1e</a>), closes <a href="https://redirect.github.com/googleapis/google-cloud-python/issues/15100">#15100</a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/googleapis/google-cloud-python/commit/6702c7ad7b9ecbe53940fc7ce281059a200d7cda"><code>6702c7a</code></a> chore: release main (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17809">#17809</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/6ab2fe1cff28adbaa328fc05c9201061fed8a400"><code>6ab2fe1</code></a> chore(main): release google-cloud-productregistry 0.1.0 (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17806">#17806</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/cc109caf93ddc46b748b7bcebfb952f43fe9b4b1"><code>cc109ca</code></a> chore(main): release google-auth 2.56.2 (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17814">#17814</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/9668675a54ff7644a7524889a5f4af6a4e018a3a"><code>9668675</code></a> chore: update librarian to v0.28.0 (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17811">#17811</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/d4b76faafc7c0a09cda428d39310b0a933e06e73"><code>d4b76fa</code></a> chore(sqlalchemy-bigquery): restore complete coverage (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17770">#17770</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/df0541abf6aae710fc3e6644a5d8f3f706d29c5a"><code>df0541a</code></a> fix(gapic): mock os.path.exists in mTLS tests to support newer google auth (#...</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/1a10e236b26b0e23e5c7d1318ae86c9a1e05ca37"><code>1a10e23</code></a> chore(main): release google-maps-isochrones 0.1.0 (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17804">#17804</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/2a2dc8323278deec735057255f3ade70c8eca039"><code>2a2dc83</code></a> test(bigquery): add debug info to socket leak test (<a href="https://redirect.github.com/googleapis/google-cloud-python/issues/17802">#17802</a>)</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/b2d3fb9521196fd4d9f864f608d791173e0425af"><code>b2d3fb9</code></a> chore(handwritten): centralize mypy configuration and update handwritten pack...</li> <li><a href="https://github.com/googleapis/google-cloud-python/commit/2a7d346d54dddf73c1185245c0f89a119bb333ec"><code>2a7d346</code></a> tests: remove protobuf cpp from tests which is no longer used as of Protobuf ...</li> <li>Additional commits viewable in <a href="https://github.com/googleapis/google-cloud-python/compare/proto-plus-v1.28.1...proto-plus-v1.28.2">compare view</a></li> </ul> </details> <br /> Updates `pytz` from 2026.2 to 2026.3.post1 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/stub42/pytz/commit/661bca921e29dc3eedd4430bac70816c9154c05e"><code>661bca9</code></a> Bump version numbers to 2026.3.post1 for python2 fix</li> <li><a href="https://github.com/stub42/pytz/commit/1e31a162477bfd338df4651cbb55d35a86a15cd1"><code>1e31a16</code></a> Log python version running tests, force python2</li> <li><a href="https://github.com/stub42/pytz/commit/b3ca7c3fc264252e7f8162229f9d0dc4410037ee"><code>b3ca7c3</code></a> Unix line endings</li> <li><a href="https://github.com/stub42/pytz/commit/b55039a6ad038432bfc8e718f1852f54599bfa30"><code>b55039a</code></a> Replace non-ASCII character in comment to fix build with Python 2</li> <li><a href="https://github.com/stub42/pytz/commit/5420ee2c14c95abd5258c0e43381ac9430647ab8"><code>5420ee2</code></a> Replace non-ASCII character in comment</li> <li><a href="https://github.com/stub42/pytz/commit/2c139e800b5353eb6bb9649ee51fc177b51c4e9e"><code>2c139e8</code></a> Merge branch 'fix/localize-overflow-at-datetime-extremes' of <a href="https://github.c">https://github.c</a>...</li> <li><a href="https://github.com/stub42/pytz/commit/c843864ba959a0def449dfe5c4f1547308ab8eb1"><code>c843864</code></a> Run zdump tests quietly</li> <li><a href="https://github.com/stub42/pytz/commit/518500c68a9ed1f6cda32101004c38b4cc1d6fa6"><code>518500c</code></a> Reduce noise when collecting zdump info dumps</li> <li><a href="https://github.com/stub42/pytz/commit/081f935fbc519305e147480ecd3410052f07816c"><code>081f935</code></a> Merge branch 'kytta-fix-dst' into 2026c</li> <li><a href="https://github.com/stub42/pytz/commit/8c9d69b125dabe489741e1eb24ba14fcf4a7e7c9"><code>8c9d69b</code></a> Merge branch 'master' into 2026c</li> <li>Additional commits viewable in <a href="https://github.com/stub42/pytz/compare/release_2026.2...release_2026.3.post1">compare view</a></li> </ul> </details> <br /> Updates `scramp` from 1.4.12 to 1.4.15 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/tlocke/scramp/commits">compare view</a></li> </ul> </details> <br /> Updates `sentry-sdk[fastapi]` from 2.66.0 to 2.66.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/getsentry/sentry-python/releases">sentry-sdk[fastapi]'s releases</a>.</em></p> <blockquote> <h2>2.66.1</h2> <h3>Bug Fixes 🐛</h3> <h4>Tracing</h4> <ul> <li>Handle exceptions raised within traces_sampler and other callbacks by <a href="https://github.com/ericapisani"><code>@ericapisani</code></a> in <a href="https://redirect.github.com/getsentry/sentry-python/pull/6853">#6853</a></li> </ul> <h3>Internal Changes 🔧</h3> <ul> <li>Fix flaky decorator test by <a href="https://github.com/sl0thentr0py"><code>@sl0thentr0py</code></a> in <a href="https://redirect.github.com/getsentry/sentry-python/pull/6830">#6830</a></li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md">sentry-sdk[fastapi]'s changelog</a>.</em></p> <blockquote> <h2>2.66.1</h2> <h3>Bug Fixes 🐛</h3> <h4>Tracing</h4> <ul> <li>Handle exceptions raised within traces_sampler and other callbacks by <a href="https://github.com/ericapisani"><code>@ericapisani</code></a> in <a href="https://redirect.github.com/getsentry/sentry-python/pull/6853">#6853</a></li> </ul> <h3>Internal Changes 🔧</h3> <ul> <li>Fix flaky decorator test by <a href="https://github.com/sl0thentr0py"><code>@sl0thentr0py</code></a> in <a href="https://redirect.github.com/getsentry/sentry-python/pull/6830">#6830</a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/getsentry/sentry-python/commit/653a292f563e02a87e4544969af2f2d55566f1c2"><code>653a292</code></a> Update CHANGELOG.md</li> <li><a href="https://github.com/getsentry/sentry-python/commit/e20c2266cb07a6449b35c68ea83784bae9f770e4"><code>e20c226</code></a> release: 2.66.1</li> <li><a href="https://github.com/getsentry/sentry-python/commit/4524b65d4118f497e4fc497b9bba25a0359847b4"><code>4524b65</code></a> fix(tracing): Stop setting <code>NoOpSpan</code> on scope in the streaming trace lifecyc...</li> <li><a href="https://github.com/getsentry/sentry-python/commit/2e9f26ee63c861fd2afc0905b2294eb58a0b01d9"><code>2e9f26e</code></a> ref(tracing): No-op and emit warning in <code>start_transaction</code> with the streamin...</li> <li><a href="https://github.com/getsentry/sentry-python/commit/3a50950e632d9923f45a9b6fb18d89e1f27badad"><code>3a50950</code></a> fix(tracing): handle exceptions raised within traces_sampler and other callba...</li> <li><a href="https://github.com/getsentry/sentry-python/commit/b5171b7ade539e70aa074632e6b5435afb1ff5ff"><code>b5171b7</code></a> ref: Use top-level <code>trace_lifecycle</code> and <code>ignore_spans</code> options in tests (<a href="https://redirect.github.com/getsentry/sentry-python/issues/6855">#6855</a>)</li> <li><a href="https://github.com/getsentry/sentry-python/commit/17e0348cacbe319b512234d85687e7d178feac93"><code>17e0348</code></a> ref: Use old sampling context format in span streaming (<a href="https://redirect.github.com/getsentry/sentry-python/issues/6848">#6848</a>)</li> <li><a href="https://github.com/getsentry/sentry-python/commit/2e0949760f600fafa168d8339179220eebcfdcfb"><code>2e09497</code></a> test: Add streaming tests to <code>test_http_headers</code> (<a href="https://redirect.github.com/getsentry/sentry-python/issues/6785">#6785</a>)</li> <li><a href="https://github.com/getsentry/sentry-python/commit/9996734c9cf733ad92cb3bd1546a64da773eb4ad"><code>9996734</code></a> feat(tracing): Send <code>sentry.segment.name.source</code> instead of `sentry.span.sour...</li> <li><a href="https://github.com/getsentry/sentry-python/commit/00224f7a99dd593016f43c236f855ec766da0082"><code>00224f7</code></a> remove span streaming docs in changelog (<a href="https://redirect.github.com/getsentry/sentry-python/issues/6831">#6831</a>)</li> <li>Additional commits viewable in <a href="https://github.com/getsentry/sentry-python/compare/2.66.0...2.66.1">compare view</a></li> </ul> </details> <br /> Updates `pre-commit` from 4.6.0 to 4.6.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pre-commit/pre-commit/releases">pre-commit's releases</a>.</em></p> <blockquote> <h2>pre-commit v4.6.1</h2> <h3>Fixes</h3> <ul> <li>Install <code>language: node</code> hooks via <code>git</code>. <ul> <li>Fixes npm 12.x compatibility</li> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3719">#3719</a> PR by <a href="https://github.com/asottile"><code>@asottile</code></a>.</li> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3517">#3517</a> issue by <a href="https://github.com/ojob"><code>@ojob</code></a>.</li> </ul> </li> <li>Set <code>JULIA_DEPOT_PATH</code> for <code>language: julia</code>. <ul> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3711">#3711</a> PR by <a href="https://github.com/damonbayer"><code>@damonbayer</code></a>.</li> <li><a href="https://redirect.github.com/pre-commit-ci/runner-image/issues/335">pre-commit-ci/runner-image#335</a> issue by <a href="https://github.com/damonbayer"><code>@damonbayer</code></a>.</li> </ul> </li> <li>Produce error on mistyped <code>--repo</code> for <code>pre-commit autoupdate</code>. <ul> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3701">#3701</a> PR by <a href="https://github.com/mxr"><code>@mxr</code></a>.</li> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3695">#3695</a> issue by <a href="https://github.com/mxr"><code>@mxr</code></a>.</li> </ul> </li> <li>Improve performance of commit existence check in <code>pre-push</code>. <ul> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3726">#3726</a> PR by <a href="https://github.com/asottile"><code>@asottile</code></a>.</li> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3604">#3604</a> issue by <a href="https://github.com/ptarjan"><code>@ptarjan</code></a>.</li> </ul> </li> <li>Avoid duplicating conflicted filenames during <code>pre-commit run --all-files</code>. <ul> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3727">#3727</a> PR by <a href="https://github.com/asottile"><code>@asottile</code></a>.</li> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3706">#3706</a> issue by <a href="https://github.com/RomanValov"><code>@RomanValov</code></a>.</li> </ul> </li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md">pre-commit's changelog</a>.</em></p> <blockquote> <h1>4.6.1 - 2026-07-21</h1> <h3>Fixes</h3> <ul> <li>Install <code>language: node</code> hooks via <code>git</code>. <ul> <li>Fixes npm 12.x compatibility</li> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3719">#3719</a> PR by <a href="https://github.com/asottile"><code>@asottile</code></a>.</li> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3517">#3517</a> issue by <a href="https://github.com/ojob"><code>@ojob</code></a>.</li> </ul> </li> <li>Set <code>JULIA_DEPOT_PATH</code> for <code>language: julia</code>. <ul> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3711">#3711</a> PR by <a href="https://github.com/damonbayer"><code>@damonbayer</code></a>.</li> <li><a href="https://redirect.github.com/pre-commit-ci/runner-image/issues/335">pre-commit-ci/runner-image#335</a> issue by <a href="https://github.com/damonbayer"><code>@damonbayer</code></a>.</li> </ul> </li> <li>Produce error on mistyped <code>--repo</code> for <code>pre-commit autoupdate</code>. <ul> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3701">#3701</a> PR by <a href="https://github.com/mxr"><code>@mxr</code></a>.</li> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3695">#3695</a> issue by <a href="https://github.com/mxr"><code>@mxr</code></a>.</li> </ul> </li> <li>Improve performance of commit existence check in <code>pre-push</code>. <ul> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3726">#3726</a> PR by <a href="https://github.com/asottile"><code>@asottile</code></a>.</li> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3604">#3604</a> issue by <a href="https://github.com/ptarjan"><code>@ptarjan</code></a>.</li> </ul> </li> <li>Avoid duplicating conflicted filenames during <code>pre-commit run --all-files</code>. <ul> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3727">#3727</a> PR by <a href="https://github.com/asottile"><code>@asottile</code></a>.</li> <li><a href="https://redirect.github.com/pre-commit/pre-commit/issues/3706">#3706</a> issue by <a href="https://github.com/RomanValov"><code>@RomanValov</code></a>.</li> </ul> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pre-commit/pre-commit/commit/242ce8a25657be59f2770b50de41fe0fd508820d"><code>242ce8a</code></a> v4.6.1</li> <li><a href="https://github.com/pre-commit/pre-commit/commit/766e550cd31defcb6096a96735c9de299b0eb301"><code>766e550</code></a> Merge pull request <a href="https://redirect.github.com/pre-commit/pre-commit/issues/3727">#3727</a> from pre-commit/dedupe</li> <li><a href="https://github.com/pre-commit/pre-commit/commit/1558d06e3d9e5f495cd97ccaefe937b7c44ead70"><code>1558d06</code></a> Merge pull request <a href="https://redirect.github.com/pre-commit/pre-commit/issues/3726">#3726</a> from pre-commit/exists-faster</li> <li><a href="https://github.com/pre-commit/pre-commit/commit/8a1c47a2528419e41aadfcf8135926d68f7ffbbb"><code>8a1c47a</code></a> avoid duplicate files in --all-files during conflict</li> <li><a href="https://github.com/pre-commit/pre-commit/commit/2e01c999b2466ac7e14e1e4a57a04504bd6c1b28"><code>2e01c99</code></a> faster check of rev existing locally as a commit</li> <li><a href="https://github.com/pre-commit/pre-commit/commit/3613bf27f5500d327de70cd2fa68fa20c8975659"><code>3613bf2</code></a> Merge pull request <a href="https://redirect.github.com/pre-commit/pre-commit/issues/3701">#3701</a> from pre-commit/autoupdate-repos</li> <li><a href="https://github.com/pre-commit/pre-commit/commit/1d811d9b0b655fa648001ca479a0b7da9ebd7b8c"><code>1d811d9</code></a> Return an error for invalid --repo</li> <li><a href="https://github.com/pre-commit/pre-commit/commit/374d354c8be227db651ddd92d9499b87e2ca1ea1"><code>374d354</code></a> Merge pull request <a href="https://redirect.github.com/pre-commit/pre-commit/issues/3711">#3711</a> from damonbayer/dmb_JULIA_DEPOT_PATH</li> <li><a href="https://github.com/pre-commit/pre-commit/commit/1e7994fb1fddd31fb1998aa98f84fc43818d9485"><code>1e7994f</code></a> set JULIA_DEPOT_PATH</li> <li><a href="https://github.com/pre-commit/pre-commit/commit/b2b91195d7618d61d8973fefa4e5e084fc160d8d"><code>b2b9119</code></a> Merge pull request <a href="https://redirect.github.com/pre-commit/pre-commit/issues/3719">#3719</a> from pre-commit/npm-unknown-options</li> <li>Additional commits viewable in <a href="https://github.com/pre-commit/pre-commit/compare/v4.6.0...v4.6.1">compare view</a></li> </ul> </details> <br /> Updates `google-api-python-client` from 2.184.0 to 2.198.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/googleapis/google-api-python-client/releases">google-api-python-client's releases</a>.</em></p> <blockquote> <h2>v2.198.0</h2> <h2><a href="https://github.com/googleapis/google-api-python-client/compare/v2.197.0...v2.198.0">2.198.0</a> (2026-06-23)</h2> <h3>Features</h3> <ul> <li><strong>adexchangebuyer2:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/a6b7a3c1312a0b843c6451f1502268232af1e08d">https://togithub.com/googleapis/google-api-python-client/commit/a6b7a3c1312a0b843c6451f1502268232af1e08d</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>admin:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/39a7f8e64940d318ce50b5431ebca0ca6f044b4e">https://togithub.com/googleapis/google-api-python-client/commit/39a7f8e64940d318ce50b5431ebca0ca6f044b4e</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>agentregistry:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/47cc6885a57ff256a2878b8902f66f4d97e980be">https://togithub.com/googleapis/google-api-python-client/commit/47cc6885a57ff256a2878b8902f66f4d97e980be</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>aiplatform:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/bf9010bd3c1f6825858612032ad8722e53368738">https://togithub.com/googleapis/google-api-python-client/commit/bf9010bd3c1f6825858612032ad8722e53368738</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>alertcenter:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/60ed501536c048d4257f05fb44d01ac90afc45c6">https://togithub.com/googleapis/google-api-python-client/commit/60ed501536c048d4257f05fb44d01ac90afc45c6</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>alloydb:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/07ab81d00d9225efc0d1bfb54d7a2131537013bb">https://togithub.com/googleapis/google-api-python-client/commit/07ab81d00d9225efc0d1bfb54d7a2131537013bb</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>analyticsadmin:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/d13cd0d5ec973a994a6409e4ccdd879ca5cdec24">https://togithub.com/googleapis/google-api-python-client/commit/d13cd0d5ec973a994a6409e4ccdd879ca5cdec24</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>analyticshub:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/29d33229a8aca59cc2105ca57f10c5c34392eedf">https://togithub.com/googleapis/google-api-python-client/commit/29d33229a8aca59cc2105ca57f10c5c34392eedf</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>androidmanagement:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/0b2dcfba95c75409fcebe62b45d481e2b9cee79c">https://togithub.com/googleapis/google-api-python-client/commit/0b2dcfba95c75409fcebe62b45d481e2b9cee79c</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>androidpublisher:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/1dc37cdcddd779ca435abc9593b0bfb4e298770d">https://togithub.com/googleapis/google-api-python-client/commit/1dc37cdcddd779ca435abc9593b0bfb4e298770d</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>artifactregistry:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/001dba95de25008758d1955c7ff5db51e48606a9">https://togithub.com/googleapis/google-api-python-client/commit/001dba95de25008758d1955c7ff5db51e48606a9</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>assuredworkloads:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/2982b1986becfc8cf17768a86146cfac04338f81">https://togithub.com/googleapis/google-api-python-client/commit/2982b1986becfc8cf17768a86146cfac04338f81</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>backupdr:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/0b64d9bb3d591fd521b86b21fdbc37f3dd793f43">https://togithub.com/googleapis/google-api-python-client/commit/0b64d9bb3d591fd521b86b21fdbc37f3dd793f43</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>bigqueryconnection:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/8e6a3e697448de8fd7128240f2615228db24e85c">https://togithub.com/googleapis/google-api-python-client/commit/8e6a3e697448de8fd7128240f2615228db24e85c</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>bigquerydatatransfer:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/012db99dae421f7b21f0e43b1df333b209cf3e15">https://togithub.com/googleapis/google-api-python-client/commit/012db99dae421f7b21f0e43b1df333b209cf3e15</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>bigquery:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/9548dcf1aa1eeaa6524b6d9386178dac69c39096">https://togithub.com/googleapis/google-api-python-client/commit/9548dcf1aa1eeaa6524b6d9386178dac69c39096</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>calendar:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/399252cfd1bed4193f5821e66536d6a3a75f03c8">https://togithub.com/googleapis/google-api-python-client/commit/399252cfd1bed4193f5821e66536d6a3a75f03c8</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>ces:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/2716cb2b0eb0d91686901d5153aa9581d1143bb4">https://togithub.com/googleapis/google-api-python-client/commit/2716cb2b0eb0d91686901d5153aa9581d1143bb4</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>chat:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/0ae828d973d7bb7f3e6f86bd4338b11b9f3c3e8f">https://togithub.com/googleapis/google-api-python-client/commit/0ae828d973d7bb7f3e6f86bd4338b11b9f3c3e8f</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>chromemanagement:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/7afd85a6912a8239b3c72ca765db28487348222a">https://togithub.com/googleapis/google-api-python-client/commit/7afd85a6912a8239b3c72ca765db28487348222a</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>chromewebstore:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/83fbd762d4539251e84ebd6af38a770c73027da7">https://togithub.com/googleapis/google-api-python-client/commit/83fbd762d4539251e84ebd6af38a770c73027da7</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>cloudbuild:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/c38d7967d2acd8762a0b803592d331c11627f750">https://togithub.com/googleapis/google-api-python-client/commit/c38d7967d2acd8762a0b803592d331c11627f750</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>clouddeploy:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/28abab7bb30a59f9487cb693ad90799ccaabdf7d">https://togithub.com/googleapis/google-api-python-client/commit/28abab7bb30a59f9487cb693ad90799ccaabdf7d</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>cloudkms:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/fead0039902e25ada74a65b06d430e8cfa7233f5">https://togithub.com/googleapis/google-api-python-client/commit/fead0039902e25ada74a65b06d430e8cfa7233f5</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li> <li><strong>cloudsupport:</strong> Update the api <a href="https://togithub.co…
Remove the starlette-admin web interface and all supporting infrastructure. The admin UI was never used in practice. - Delete the admin/ package (views, auth, config, fields) - Remove lazy admin initialization and session middleware from core/initializers.py and core/factory.py (sessions were only used by admin auth) - Drop starlette-admin and itsdangerous dependencies - Remove SESSION_SECRET_KEY plumbing from docker-compose, App Engine template, CI/CD workflows, .env.example, and tests - Delete admin-specific unit, integration, and behave tests - Update README Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…in-ui chore: remove unused admin UI
…" organization term
…a-NF-Supervisor-Office'-organization-to-lexicon feat(lexicon): add new organizations to lexicon
Bumps [actions/stale](https://github.com/actions/stale) from 10 to 11. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](actions/stale@v10...v11) --- updated-dependencies: - dependency-name: actions/stale dependency-version: '11' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
test_get_project_area assumed its "Test Group Foo" fixture would always get database id 1, which only held because nothing else in the suite created a Group row first. Any earlier-running test that inserts a Group (e.g. a data-migration test) shifts the sequence and breaks this test with an unrelated 404. Use the fixture's actual group.id instead of the literal 1.
pyproject.toml's explicit setuptools packages list omitted data_migrations, so the installed `oco` CLI couldn't import it at all -- `oco data-migrations status/run` failed with ModuleNotFoundError for every migration, not just new ones. Running via `uv run pytest`/`python -c` masked this because pytest prepends the repo root to sys.path; the installed console-script entry point does not.
The upcoming ogc_* view filter excludes non-public records, and nine currently-passing tests in test_ogc.py assert that rows backed by the shared location/water_well_thing/group fixtures ARE present in ogc_* responses. Their "draft" default was an arbitrary safe value, not a deliberate test input -- confirmed by grepping the suite for anything that depends on it being specifically "draft". Flips the three fixtures plus one inline Group(...)construction in test_ogc.py that bypassed the fixture.
Every ogc_* view/materialized view selected release_status but never filtered on it, so the unauthenticated /ogcapi endpoints have been serving private and draft records alongside public ones (e.g. water_wells: 1,145 private + 140 draft rows next to 8,678 public). Adds "AND release_status = 'public'" to all 21 existing ogc_* relations and introduces ogc_locations (previously the locations collection pointed straight at the raw location table, which has no filter at all). ogc_actively_monitored_wells gets no predicate of its own -- it already inherits public-only rows transitively through its join to ogc_water_well_summary; adding a redundant filter on status_history.release_status would repeat a mistake already made and reverted once (see w1x2y3z4a5b6), since that column is never populated by the transfer scripts. Fully reversible: downgrade() rebuilds the same relations with the byte-identical unfiltered SQL that was in production before this migration (ogc_locations is the exception, since it didn't exist pre-migration -- downgrade drops it rather than recreating it unfiltered). Repoints core/pygeoapi-config.yml's locations provider at the new view in the same commit, since shipping the view without the config change (or vice versa) leaves the collection either unfiltered or broken. Layer visibility (which collections are published)is unchanged. That's separate, out-of-scope work.
ogc_project_areas is now filtered to public records, but all 56 current project_area-bearing group rows are release_status=draft (confirmed in docs/ogc-layer-audit.md), which would make the layer return zero rows until someone flips them. Uses the data_migrations framework (not Alembic, which is schema-only in this repo) so the change is tracked, skip-if-applied, and gated on this ticket's schema revision having landed first. Runs independently via `oco data-migrations run 20260714_0001_publish_project_areas` -- deliberately not swept in via run-all, which could also apply other unrelated pending migrations. No downgrade: this framework is forward-only, and a blanket revert couldn't tell rows this migration published apart from ones published independently afterward -- undoing it later means writing a new, deliberate migration instead. This is a genuine publication decision, not a mechanical schema change -- confirm the 56 rows are actually appropriate for public release before merging.
…r-metadata chore(ogc): rich layer and field-level metadata
…3.19 in the gha-minor-and-patch group (#879) Bumps the gha-minor-and-patch group with 1 update: [dagster-io/dagster-cloud-action](https://github.com/dagster-io/dagster-cloud-action). Updates `dagster-io/dagster-cloud-action` from 1.13.18 to 1.13.19 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/dagster-io/dagster-cloud-action/commit/a5c409dd1635efc77ca2a3925288864f1b35f73e"><code>a5c409d</code></a> Rebuild for 1.13.19</li> <li>See full diff in <a href="https://github.com/dagster-io/dagster-cloud-action/compare/v1.13.18...v1.13.19">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the uv-non-major group with 10 updates: | Package | From | To | | --- | --- | --- | | [charset-normalizer](https://github.com/jawah/charset_normalizer) | `3.5.0` | `3.5.1` | | [cloud-sql-python-connector](https://github.com/GoogleCloudPlatform/cloud-sql-python-connector) | `1.21.0` | `1.22.0` | | [gunicorn](https://github.com/benoitc/gunicorn) | `26.0.0` | `26.1.0` | | [idna](https://github.com/kjd/idna) | `3.18` | `3.19` | | [pygments](https://github.com/pygments/pygments) | `2.20.0` | `2.21.0` | | [uvicorn](https://github.com/Kludex/uvicorn) | `0.52.3` | `0.52.4` | | [python-dotenv](https://github.com/theskumar/python-dotenv) | `1.2.2` | `1.2.3` | | [google-api-python-client](https://github.com/googleapis/google-api-python-client) | `2.198.0` | `2.199.0` | | [dagster](https://github.com/dagster-io/dagster) | `1.13.18` | `1.13.19` | | [dagster-cloud](https://github.com/dagster-io/dagster-cloud) | `1.13.18` | `1.13.19` | Updates `charset-normalizer` from 3.5.0 to 3.5.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/jawah/charset_normalizer/releases">charset-normalizer's releases</a>.</em></p> <blockquote> <h2>Version 3.5.1</h2> <h2><a href="https://github.com/Ousret/charset_normalizer/compare/3.5.0...3.5.1">3.5.1</a> (2026-08-15)</h2> <h3>Changed</h3> <ul> <li>Raised upper bound of setuptools to v84 (<a href="https://redirect.github.com/jawah/charset_normalizer/issues/794">#794</a>)</li> <li>Cache performance access optimization for our CharInfo struct (prebuilt only).</li> </ul> <h3>Fixed</h3> <ul> <li>No longer decoding large content when the noise detector output give a high entropy. Only impacted large content input >1M bytes.</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md">charset-normalizer's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/Ousret/charset_normalizer/compare/3.5.0...3.5.1">3.5.1</a> (2026-08-15)</h2> <h3>Changed</h3> <ul> <li>Raised upper bound of setuptools to v84 (<a href="https://redirect.github.com/jawah/charset_normalizer/issues/794">#794</a>)</li> <li>Cache performance access optimization for our CharInfo struct (prebuilt only).</li> </ul> <h3>Fixed</h3> <ul> <li>No longer decoding large content when the noise detector output give a high entropy. Only impacted large content input >1M bytes.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/jawah/charset_normalizer/commit/e239bdc5cc1eb1f0db08d4046ad531f805dbea71"><code>e239bdc</code></a> Merge pull request <a href="https://redirect.github.com/jawah/charset_normalizer/issues/795">#795</a> from jawah/release-3.5.1</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/648ad776db64a00aa7efd70a94656ac43784abb3"><code>648ad77</code></a> docs: update faq</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/fab27492c39baa61aca12826022e266781108570"><code>fab2749</code></a> docs: write changelog for 3.5.1</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/7d32774e75d16cccd3d22c758a77fca135952787"><code>7d32774</code></a> chore: bump version to 3.5.1</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/9a69f609f254ba4bfe9d0cbf375728e43360cdf2"><code>9a69f60</code></a> docs: update data/info</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/5dcc6dd81a8a0a4bd525f8d6f508da8285caf402"><code>5dcc6dd</code></a> perf: charinfo cache access optimization in cython</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/ea3b4479270762be1228562c590e5a212727f208"><code>ea3b447</code></a> fix: do not validate-decode large payload when md says it's noise</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/a05917f87b5f71d6022d8abe2b0af239f65c1111"><code>a05917f</code></a> chore: allow setuptools 84 builds (<a href="https://redirect.github.com/jawah/charset_normalizer/issues/794">#794</a>)</li> <li>See full diff in <a href="https://github.com/jawah/charset_normalizer/compare/3.5.0...3.5.1">compare view</a></li> </ul> </details> <br /> Updates `cloud-sql-python-connector` from 1.21.0 to 1.22.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/releases">cloud-sql-python-connector's releases</a>.</em></p> <blockquote> <h2>v1.22.0</h2> <h2><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/compare/v1.21.0...v1.22.0">1.22.0</a> (2026-08-18)</h2> <h3>Features</h3> <ul> <li>Add PSC DNS and Global Write Endpoint support to Python Connector (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1446">#1446</a>) (<a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/62640f3c4f1e5cccf9c1c4622d4025804e92d02f">62640f3</a>)</li> <li>add support for psycopg (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1452">#1452</a>) (<a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/ba58f8ff573e5559dd7d9b4be7ffb2db6d5db6da">ba58f8f</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>psycopg:</strong> add platform guard for platforms without AF_UNIX support (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1466">#1466</a>) (<a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2dfee663f8e5bbf0392ea1cf9940ec5e8b533448">2dfee66</a>)</li> <li>update deps to the latest (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1456">#1456</a>) (<a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/a1bdfc7b3ae16af2c99c6faa1b12757d55d6ad72">a1bdfc7</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>update pg8000 link to new repository location (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1368">#1368</a>) (<a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2b20167d683a1bc827f37bbb421cf5d6fa2e0de0">2b20167</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/blob/main/CHANGELOG.md">cloud-sql-python-connector's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/compare/v1.21.0...v1.22.0">1.22.0</a> (2026-08-18)</h2> <h3>Features</h3> <ul> <li>Add PSC DNS and Global Write Endpoint support to Python Connector (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1446">#1446</a>) (<a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/62640f3c4f1e5cccf9c1c4622d4025804e92d02f">62640f3</a>)</li> <li>add support for psycopg (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1452">#1452</a>) (<a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/ba58f8ff573e5559dd7d9b4be7ffb2db6d5db6da">ba58f8f</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>psycopg:</strong> add platform guard for platforms without AF_UNIX support (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1466">#1466</a>) (<a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2dfee663f8e5bbf0392ea1cf9940ec5e8b533448">2dfee66</a>)</li> <li>update deps to the latest (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1456">#1456</a>) (<a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/a1bdfc7b3ae16af2c99c6faa1b12757d55d6ad72">a1bdfc7</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>update pg8000 link to new repository location (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1368">#1368</a>) (<a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2b20167d683a1bc827f37bbb421cf5d6fa2e0de0">2b20167</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/257407a9d7538ba4cebf47cf14a64f741af6365e"><code>257407a</code></a> chore(main): release 1.22.0 (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1455">#1455</a>)</li> <li><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/847b34f0d6ac07cda5b35bac1a6030127747d6d4"><code>847b34f</code></a> chore(deps): update dependency idna to v3.19 (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1468">#1468</a>)</li> <li><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/31c415e860354446da88c918b818dda56fbdfcfa"><code>31c415e</code></a> ci: skip schedule reporter on forks (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1469">#1469</a>)</li> <li><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2dfee663f8e5bbf0392ea1cf9940ec5e8b533448"><code>2dfee66</code></a> fix(psycopg): add platform guard for platforms without AF_UNIX support (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1466">#1466</a>)</li> <li><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2b20167d683a1bc827f37bbb421cf5d6fa2e0de0"><code>2b20167</code></a> docs: update pg8000 link to new repository location (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1368">#1368</a>)</li> <li><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/ba58f8ff573e5559dd7d9b4be7ffb2db6d5db6da"><code>ba58f8f</code></a> feat: add support for psycopg (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1452">#1452</a>)</li> <li><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/5aa23dcaff5c1907e655e771f4ad487f5cd9ea62"><code>5aa23dc</code></a> test: improve unit test coverage and fix deprecation warnings (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1453">#1453</a>)</li> <li><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/a1bdfc7b3ae16af2c99c6faa1b12757d55d6ad72"><code>a1bdfc7</code></a> fix: update deps to the latest (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1456">#1456</a>)</li> <li><a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/62640f3c4f1e5cccf9c1c4622d4025804e92d02f"><code>62640f3</code></a> feat: Add PSC DNS and Global Write Endpoint support to Python Connector (<a href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1446">#1446</a>)</li> <li>See full diff in <a href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/compare/v1.21.0...v1.22.0">compare view</a></li> </ul> </details> <br /> Updates `gunicorn` from 26.0.0 to 26.1.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/benoitc/gunicorn/releases">gunicorn's releases</a>.</em></p> <blockquote> <h2>gunicorn 26.1.0</h2> <h3>New Features</h3> <ul> <li><strong>Glob patterns in <code>reload_extra_files</code></strong>: entries containing <code>*</code>, <code>?</code> or <code>[</code> are treated as patterns, so <code>ui/*/config.json</code> watches every view's config without listing them one by one. Patterns are re-expanded on every reload check rather than once at startup, so a file created later starts being watched without restarting gunicorn, and <code>**</code> recurses. A pattern matching nothing warns instead of failing, since with live expansion it may match later (<a href="https://redirect.github.com/benoitc/gunicorn/issues/1643">#1643</a>, <a href="https://redirect.github.com/benoitc/gunicorn/pull/3662">#3662</a>).</li> </ul> <h3>Security</h3> <ul> <li><strong>Dependency floors raised past known advisories</strong>: every declared floor was checked against the advisory database. <code>tornado</code>, <code>h2</code>, <code>setuptools</code> and <code>pymdown-extensions</code> permitted vulnerable versions and now require the first clean release; <code>pytest</code> and <code>httpx</code> were unpinned and now carry floors. The <code>tornado</code> example pinned <code>tornado<6</code>, which was both the source of several advisories and older than the <code>>=6.5.0</code> the tornado worker needs, so the example could not run as pinned.</li> </ul> <h3>Bug Fixes</h3> <ul> <li> <p><strong>SIGHUP did not reload the logger configuration</strong>: <code>Arbiter.reload()</code> re-read the configuration file but kept using the logger built at startup, calling only <code>reopen_files()</code> on its existing handlers. Changes to <code>logconfig</code>, <code>logconfig_dict</code>, <code>logconfig_json</code> and <code>loglevel</code> were ignored until a full restart, which in containers meant replacing the pod. The existing logger now re-runs its setup on reload, so new handlers, formats and levels take effect while the process identity and its listeners are preserved, and re-running the setup no longer stacks duplicate syslog handlers. An invalid log configuration on reload is not fatal either: the error is reported on stderr, the previous working configuration is restored and the master keeps running with it (<a href="https://redirect.github.com/benoitc/gunicorn/issues/3353">#3353</a>).</p> </li> <li> <p><strong>Truncated chunked bodies accepted</strong>: RFC 9112 section 7.1.2 ends a chunked body with <code>0 CRLF CRLF</code>, the second CRLF being the mandatory empty trailer section. <code>ChunkedReader.parse_chunk_size()</code> swallowed the <code>NoMoreData</code> raised while scanning for it, so a body cut short right after the last chunk line was treated as complete instead of rejected. It now raises <code>ChunkMissingTerminator</code> (<a href="https://redirect.github.com/benoitc/gunicorn/issues/3382">#3382</a>, <a href="https://redirect.github.com/benoitc/gunicorn/pull/3685">#3685</a>).</p> </li> <li> <p><strong><code>--spew</code> crashed on dynamically generated code</strong>: the trace hook indexed the 2-tuple returned by <code>inspect.getsourcelines()</code> by line number rather than indexing the list of lines, so a frame with no <code>__file__</code> raised <code>AttributeError: 'int' object has no attribute 'rstrip'</code> on line 1 and</p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/benoitc/gunicorn/commit/71b59a75820dd4a762dc42a3280124168b4e44a8"><code>71b59a7</code></a> Merge pull request <a href="https://redirect.github.com/benoitc/gunicorn/issues/3698">#3698</a> from benoitc/fix/docker-health-check-readerror</li> <li><a href="https://github.com/benoitc/gunicorn/commit/48287de8d8360825c85ac981ddfe9c80dba3b418"><code>48287de</code></a> test: catch every transport error in the docker health check</li> <li><a href="https://github.com/benoitc/gunicorn/commit/3110e8c37f716ca0ed63ca7f80c7c9ea0fbbdd50"><code>3110e8c</code></a> Merge pull request <a href="https://redirect.github.com/benoitc/gunicorn/issues/3696">#3696</a> from benoitc/docs/roadmap</li> <li><a href="https://github.com/benoitc/gunicorn/commit/cc56c410b7103c1f2b877279f81cb3a14705315a"><code>cc56c41</code></a> Merge pull request <a href="https://redirect.github.com/benoitc/gunicorn/issues/3693">#3693</a> from benoitc/release/26.1.0</li> <li><a href="https://github.com/benoitc/gunicorn/commit/5cf1f1651a40fa36afe13fde623e3437ca872463"><code>5cf1f16</code></a> docs: surface the roadmap on the site home page</li> <li><a href="https://github.com/benoitc/gunicorn/commit/7e35f72d135056c37da321becf22b19aeec06937"><code>7e35f72</code></a> docs: add FastCGI to the roadmap and point items at Ideas</li> <li><a href="https://github.com/benoitc/gunicorn/commit/18ddc586c9b9513b25e92c6ed6f818f66ff3abcd"><code>18ddc58</code></a> docs: drop the framework and reverse-proxy non-goals from the roadmap</li> <li><a href="https://github.com/benoitc/gunicorn/commit/1ecae56ebd096ee4f94d12c59a36f240ce348572"><code>1ecae56</code></a> docs: add a roadmap and make the chat easy to find</li> <li><a href="https://github.com/benoitc/gunicorn/commit/ca412e3f7134bd9f0e91851778ae6d8dd222cf41"><code>ca412e3</code></a> docs: sync the Latest changelog page with 26.1.0</li> <li><a href="https://github.com/benoitc/gunicorn/commit/640936fb29f7bdf5665d5b7f919783bb73e2f981"><code>640936f</code></a> docs: note the dependency security work in 26.1.0</li> <li>Additional commits viewable in <a href="https://github.com/benoitc/gunicorn/compare/26.0.0...26.1.0">compare view</a></li> </ul> </details> <br /> Updates `idna` from 3.18 to 3.19 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/kjd/idna/releases">idna's releases</a>.</em></p> <blockquote> <h2>v3.19</h2> <ul> <li>Restore the <code>std3_rules</code> option, which had no effect since changes to UTS <a href="https://redirect.github.com/kjd/idna/issues/46">#46</a> processing in Unicode 16. Note that <code>uts46_remap()</code> defaults to enabling STD3 rules, so direct callers will see input containing non-LDH ASCII characters rejected again.</li> <li>Performance improvements to UTS <a href="https://redirect.github.com/kjd/idna/issues/46">#46</a> mapping, particularly for ASCII-only domains.</li> <li>Test on free-threaded CPython with the GIL disabled and document thread safety.</li> <li>Expose the Unicode version of the generated tables as <code>idna.unicode_version</code>, and show it in <code>idna --version</code>.</li> <li>Add <code>code</code>, <code>text</code>, <code>codepoint</code> and <code>position</code> attributes to <code>IDNAError</code> so that the failed rule and the offending character can be identified without parsing the exception message.</li> <li>The deprecated <code>transitional</code> argument to <code>encode()</code> and <code>uts46_remap()</code> is now completely ignored, and gives a deprecation warning for the latter.</li> <li>Reject A-labels that are not the canonical Punycode encoding of their U-label.</li> <li>Fix CONTEXTJ violations raising <code>IDNAError</code> instead of <code>InvalidCodepointContext</code>.</li> <li>Consistently raise <code>IDNAError</code> for empty labels and non-ASCII bytes passed to label helper functions and the incremental codec.</li> <li>Add property-based tests, extended fuzzing targets, coverage measurement, and CI checks that the data tables match the generator output.</li> <li>Various code quality and tooling improvements.</li> </ul> <p>Thanks to stefan6419846, LouieLuNZ, and Salvatore Corvaglia for contributions to this release.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/kjd/idna/blob/master/HISTORY.md">idna's changelog</a>.</em></p> <blockquote> <h2>3.19 (2026-08-18)</h2> <ul> <li>Restore the <code>std3_rules</code> option, which had no effect since changes to UTS <a href="https://redirect.github.com/kjd/idna/issues/46">#46</a> processing in Unicode 16. Note that <code>uts46_remap()</code> defaults to enabling STD3 rules, so direct callers will see input containing non-LDH ASCII characters rejected again.</li> <li>Performance improvements to UTS <a href="https://redirect.github.com/kjd/idna/issues/46">#46</a> mapping, particularly for ASCII-only domains.</li> <li>Test on free-threaded CPython with the GIL disabled and document thread safety.</li> <li>Expose the Unicode version of the generated tables as <code>idna.unicode_version</code>, and show it in <code>idna --version</code>.</li> <li>Add <code>code</code>, <code>text</code>, <code>codepoint</code> and <code>position</code> attributes to <code>IDNAError</code> so that the failed rule and the offending character can be identified without parsing the exception message.</li> <li>The deprecated <code>transitional</code> argument to <code>encode()</code> and <code>uts46_remap()</code> is now completely ignored, and gives a deprecation warning for the latter.</li> <li>Reject A-labels that are not the canonical Punycode encoding of their U-label.</li> <li>Fix CONTEXTJ violations raising <code>IDNAError</code> instead of <code>InvalidCodepointContext</code>.</li> <li>Consistently raise <code>IDNAError</code> for empty labels and non-ASCII bytes passed to label helper functions and the incremental codec.</li> <li>Add property-based tests, extended fuzzing targets, coverage measurement, and CI checks that the data tables match the generator output.</li> <li>Various code quality and tooling improvements.</li> </ul> <p>Thanks to stefan6419846, LouieLuNZ, and Salvatore Corvaglia for contributions to this release.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/kjd/idna/commit/03a9a11dd8aecd4fea742cabe20f4d3d9ed82abb"><code>03a9a11</code></a> Release 3.19</li> <li><a href="https://github.com/kjd/idna/commit/2d2a7ef0c59210a48407b3dde6d884933cecf093"><code>2d2a7ef</code></a> Pre-release 3.19rc0</li> <li><a href="https://github.com/kjd/idna/commit/5cce1308d148019c5fa0febceafa13e99cdacfe7"><code>5cce130</code></a> Merge pull request <a href="https://redirect.github.com/kjd/idna/issues/268">#268</a> from kjd/fix-std3-regex-alert</li> <li><a href="https://github.com/kjd/idna/commit/3914b75f3e4cbc11e59f92eeecdb16d10871e57f"><code>3914b75</code></a> Split the STD3 disallowed-character range so uppercase is explicit</li> <li><a href="https://github.com/kjd/idna/commit/ce9fd98ac4073866db276e93834b259f2a5a4ac4"><code>ce9fd98</code></a> Merge pull request <a href="https://redirect.github.com/kjd/idna/issues/267">#267</a> from kjd/housekeeping</li> <li><a href="https://github.com/kjd/idna/commit/809240c3cc9358c9c9c79b2d12ffe39e75ccfb0f"><code>809240c</code></a> Fail CI when the license copyright year is behind the current year</li> <li><a href="https://github.com/kjd/idna/commit/d9e16c523d7d25dcc14100fa80f3e303404e09be"><code>d9e16c5</code></a> Consolidate test fixtures, prune stale gitignore entries, and fix doc typos</li> <li><a href="https://github.com/kjd/idna/commit/ef30feeed3a758e96286fdab0315a551f7f5e7d6"><code>ef30fee</code></a> Remove dead code and pare back superfluous comments</li> <li><a href="https://github.com/kjd/idna/commit/b907913f854d26cc714f721c6c2cb626d41ac468"><code>b907913</code></a> Tighten the version support and Unicode notes in the README</li> <li><a href="https://github.com/kjd/idna/commit/6204cbe343ef438df7c58bc80b94d0f960991d90"><code>6204cbe</code></a> Ignore local build artifacts and stop packaging stray tooling config</li> <li>Additional commits viewable in <a href="https://github.com/kjd/idna/compare/v3.18...v3.19">compare view</a></li> </ul> </details> <br /> Updates `pygments` from 2.20.0 to 2.21.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pygments/pygments/releases">pygments's releases</a>.</em></p> <blockquote> <h2>2.21.0</h2> <ul> <li> <p>New lexers:</p> <ul> <li>BitBake (<a href="https://redirect.github.com/pygments/pygments/issues/3103">#3103</a>)</li> <li>Caddyfile (<a href="https://redirect.github.com/pygments/pygments/issues/3225">#3225</a>)</li> <li>CEL (<a href="https://redirect.github.com/pygments/pygments/issues/3048">#3048</a>)</li> <li>PureScript (<a href="https://redirect.github.com/pygments/pygments/issues/1077">#1077</a>, <a href="https://redirect.github.com/pygments/pygments/issues/3054">#3054</a>)</li> </ul> </li> <li> <p>Updated lexers:</p> <ul> <li>Bash: Fix coloured keyword at the beginning of a name (<a href="https://redirect.github.com/pygments/pygments/issues/2926">#2926</a>)</li> <li>Boogie: Add missing Boogie and Civl Verifier keywords (<a href="https://redirect.github.com/pygments/pygments/issues/3156">#3156</a>)</li> <li>C#: <ul> <li>Recognize interpolated verbatim strings with either <code>$@</code> or <code>@$</code> prefixes (<a href="https://redirect.github.com/pygments/pygments/issues/2685">#2685</a>)</li> <li>Support dollar-prefixed and multi-quote raw strings (<a href="https://redirect.github.com/pygments/pygments/issues/3129">#3129</a>, <a href="https://redirect.github.com/pygments/pygments/issues/2897">#2897</a>)</li> <li>Recognize <code>union</code> (<a href="https://redirect.github.com/pygments/pygments/issues/3182">#3182</a>)</li> </ul> </li> <li>C/C++: <ul> <li>Add C23/C++26 attributes (<a href="https://redirect.github.com/pygments/pygments/issues/3084">#3084</a>)</li> <li>Add more C2Y keywords (<a href="https://redirect.github.com/pygments/pygments/issues/3092">#3092</a>)</li> <li>Highlight a function following a namespace body (<a href="https://redirect.github.com/pygments/pygments/issues/2928">#2928</a>)</li> <li>Fix C/C++ lexer support for multiline pre-processor comments (<a href="https://redirect.github.com/pygments/pygments/issues/3051">#3051</a>)</li> <li>Add <code>.ipp</code> as a file extension (<a href="https://redirect.github.com/pygments/pygments/issues/3141">#3141</a>, <a href="https://redirect.github.com/pygments/pygments/issues/1008">#1008</a>)</li> </ul> </li> <li>Clojure: Recognize named, octal and unicode character literals such as <code>\space</code> and <code>\o377</code> as a single token (<a href="https://redirect.github.com/pygments/pygments/issues/979">#979</a>)</li> <li>Csound: Add missing opcode parameter type letter (<a href="https://redirect.github.com/pygments/pygments/issues/3161">#3161</a>)</li> <li>CUDA: Derive from the C++ lexer instead of C to highlight C++ constructs such as <code>template</code>, <code>class</code> and <code>namespace</code> (<a href="https://redirect.github.com/pygments/pygments/issues/3127">#3127</a>)</li> <li>D: Allow non-ASCII (Unicode) identifiers (<a href="https://redirect.github.com/pygments/pygments/issues/1088">#1088</a>)</li> <li>Fish: Fix single quote backslash escape (<a href="https://redirect.github.com/pygments/pygments/issues/3138">#3138</a>, <a href="https://redirect.github.com/pygments/pygments/issues/2821">#2821</a>)</li> <li>Go: Various lexer improvements (<a href="https://redirect.github.com/pygments/pygments/issues/3199">#3199</a>)</li> <li>GoogleSQL: Require a word break after <code>SET</code> (<a href="https://redirect.github.com/pygments/pygments/issues/3167">#3167</a>)</li> <li>Hexdump: Only match valid digits (<a href="https://redirect.github.com/pygments/pygments/issues/3200">#3200</a>, <a href="https://redirect.github.com/pygments/pygments/issues/2847">#2847</a>)</li> <li>JavaScript: Highlight the <code>arguments</code> object (<a href="https://redirect.github.com/pygments/pygments/issues/3146">#3146</a>)</li> <li>Jsonnet: Recognize colons in array slice expressions (<a href="https://redirect.github.com/pygments/pygments/issues/2828">#2828</a>)</li> <li>JSX: Allow apostrophes in element text (<a href="https://redirect.github.com/pygments/pygments/issues/2816">#2816</a>)</li> <li>Julia: Fix rstrings backslash (<a href="https://redirect.github.com/pygments/pygments/issues/3140">#3140</a>, <a href="https://redirect.github.com/pygments/pygments/issues/2537">#2537</a>)</li> <li>Kotlin: Support companion objects without an explicit name (<a href="https://redirect.github.com/pygments/pygments/issues/2525">#2525</a>)</li> <li>Kotlin: Don't let a nullable type marker (<code>?</code>) consume the following character, so <code>Foo?,</code> and <code>a?:b</code> tokenize correctly (<a href="https://redirect.github.com/pygments/pygments/issues/2964">#2964</a>)</li> <li>Kusto: Recognize member-access dots in dynamic objects (<a href="https://redirect.github.com/pygments/pygments/issues/2779">#2779</a>)</li> <li>Lua: Various improvements (<a href="https://redirect.github.com/pygments/pygments/issues/3143">#3143</a>)</li> <li>Macaulay2: Update symbols to 1.26.05 (<a href="https://redirect.github.com/pygments/pygments/issues/3120">#3120</a>)</li> <li>Markdown: <ul> <li>Highlight bold-italics (<code>***...***</code> and <code>___...___</code>) (<a href="https://redirect.github.com/pygments/pygments/issues/3067">#3067</a>)</li> <li>Fix mention regex to support hyphens in usernames (<a href="https://redirect.github.com/pygments/pygments/issues/3139">#3139</a>, <a href="https://redirect.github.com/pygments/pygments/issues/3135">#3135</a>)</li> </ul> </li> <li>Markdown, reStructuredText, TiddlyWiki5: Fix wrong token offsets for embedded code blocks (<a href="https://redirect.github.com/pygments/pygments/issues/3133">#3133</a>)</li> <li>Mathematica: Recognize <code>\[Name]</code> named-character escapes such as <code>\[Nu]</code> instead of emitting an <code>Error</code> token (<a href="https://redirect.github.com/pygments/pygments/issues/3097">#3097</a>)</li> </ul> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/pygments/pygments/blob/master/CHANGES">pygments's changelog</a>.</em></p> <blockquote> <h2>Version 2.21.0</h2> <p>(released August 17th, 2026)</p> <ul> <li> <p>New lexers:</p> <ul> <li>BitBake (<a href="https://redirect.github.com/pygments/pygments/issues/3103">#3103</a>)</li> <li>Caddyfile (<a href="https://redirect.github.com/pygments/pygments/issues/3225">#3225</a>)</li> <li>CEL (<a href="https://redirect.github.com/pygments/pygments/issues/3048">#3048</a>)</li> <li>PureScript (<a href="https://redirect.github.com/pygments/pygments/issues/1077">#1077</a>, <a href="https://redirect.github.com/pygments/pygments/issues/3054">#3054</a>)</li> </ul> </li> <li> <p>Updated lexers:</p> <ul> <li>Bash: Fix coloured keyword at the beginning of a name (<a href="https://redirect.github.com/pygments/pygments/issues/2926">#2926</a>)</li> <li>Boogie: Add missing Boogie and Civl Verifier keywords (<a href="https://redirect.github.com/pygments/pygments/issues/3156">#3156</a>)</li> <li>C#: <ul> <li>Recognize interpolated verbatim strings with either <code>$@</code> or <code>@$</code> prefixes (<a href="https://redirect.github.com/pygments/pygments/issues/2685">#2685</a>)</li> <li>Support dollar-prefixed and multi-quote raw strings (<a href="https://redirect.github.com/pygments/pygments/issues/3129">#3129</a>, <a href="https://redirect.github.com/pygments/pygments/issues/2897">#2897</a>)</li> <li>Recognize <code>union</code> (<a href="https://redirect.github.com/pygments/pygments/issues/3182">#3182</a>)</li> </ul> </li> <li>C/C++: <ul> <li>Add C23/C++26 attributes (<a href="https://redirect.github.com/pygments/pygments/issues/3084">#3084</a>)</li> <li>Add more C2Y keywords (<a href="https://redirect.github.com/pygments/pygments/issues/3092">#3092</a>)</li> <li>Highlight a function following a namespace body (<a href="https://redirect.github.com/pygments/pygments/issues/2928">#2928</a>)</li> <li>Fix C/C++ lexer support for multiline pre-processor comments (<a href="https://redirect.github.com/pygments/pygments/issues/3051">#3051</a>)</li> <li>Add <code>.ipp</code> as a file extension (<a href="https://redirect.github.com/pygments/pygments/issues/3141">#3141</a>, <a href="https://redirect.github.com/pygments/pygments/issues/1008">#1008</a>)</li> </ul> </li> <li>Clojure: Recognize named, octal and unicode character literals such as <code>\space</code> and <code>\o377</code> as a single token (<a href="https://redirect.github.com/pygments/pygments/issues/979">#979</a>)</li> <li>Csound: Add missing opcode parameter type letter (<a href="https://redirect.github.com/pygments/pygments/issues/3161">#3161</a>)</li> <li>CUDA: Derive from the C++ lexer instead of C to highlight C++ constructs such as <code>template</code>, <code>class</code> and <code>namespace</code> (<a href="https://redirect.github.com/pygments/pygments/issues/3127">#3127</a>)</li> <li>D: Allow non-ASCII (Unicode) identifiers (<a href="https://redirect.github.com/pygments/pygments/issues/1088">#1088</a>)</li> <li>Fish: Fix single quote backslash escape (<a href="https://redirect.github.com/pygments/pygments/issues/3138">#3138</a>, <a href="https://redirect.github.com/pygments/pygments/issues/2821">#2821</a>)</li> <li>Go: Various lexer improvements (<a href="https://redirect.github.com/pygments/pygments/issues/3199">#3199</a>)</li> <li>GoogleSQL: Require a word break after <code>SET</code> (<a href="https://redirect.github.com/pygments/pygments/issues/3167">#3167</a>)</li> <li>Hexdump: Only match valid digits (<a href="https://redirect.github.com/pygments/pygments/issues/3200">#3200</a>, <a href="https://redirect.github.com/pygments/pygments/issues/2847">#2847</a>)</li> <li>JavaScript: Highlight the <code>arguments</code> object (<a href="https://redirect.github.com/pygments/pygments/issues/3146">#3146</a>)</li> <li>Jsonnet: Recognize colons in array slice expressions (<a href="https://redirect.github.com/pygments/pygments/issues/2828">#2828</a>)</li> <li>JSX: Allow apostrophes in element text (<a href="https://redirect.github.com/pygments/pygments/issues/2816">#2816</a>)</li> <li>Julia: Fix rstrings backslash (<a href="https://redirect.github.com/pygments/pygments/issues/3140">#3140</a>, <a href="https://redirect.github.com/pygments/pygments/issues/2537">#2537</a>)</li> <li>Kotlin: Support companion objects without an explicit name (<a href="https://redirect.github.com/pygments/pygments/issues/2525">#2525</a>)</li> <li>Kotlin: Don't let a nullable type marker (<code>?</code>) consume the following character, so <code>Foo?,</code> and <code>a?:b</code> tokenize correctly (<a href="https://redirect.github.com/pygments/pygments/issues/2964">#2964</a>)</li> <li>Kusto: Recognize member-access dots in dynamic objects (<a href="https://redirect.github.com/pygments/pygments/issues/2779">#2779</a>)</li> <li>Lua: Various improvements (<a href="https://redirect.github.com/pygments/pygments/issues/3143">#3143</a>)</li> <li>Macaulay2: Update symbols to 1.26.05 (<a href="https://redirect.github.com/pygments/pygments/issues/3120">#3120</a>)</li> <li>Markdown: <ul> <li>Highlight bold-italics (<code>***...***</code> and <code>___...___</code>) (<a href="https://redirect.github.com/pygments/pygments/issues/3067">#3067</a>)</li> <li>Fix mention regex to support hyphens in usernames (<a href="https://redirect.github.com/pygments/pygments/issues/3139">#3139</a>, <a href="https://redirect.github.com/pygments/pygments/issues/3135">#3135</a>)</li> </ul> </li> <li>Markdown, reStructuredText, TiddlyWiki5: Fix wrong token offsets for</li> </ul> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pygments/pygments/commit/a43b45dcf081b6010c6ab4428f149f7f6d2499c4"><code>a43b45d</code></a> Get ready for the 2.21.0 release.</li> <li><a href="https://github.com/pygments/pygments/commit/d8f14cb395026abb288db38839f57499cba695e0"><code>d8f14cb</code></a> Fix version_added for Purescript.</li> <li><a href="https://github.com/pygments/pygments/commit/19c581704c466cde59fd1a49e04c3424449110f3"><code>19c5817</code></a> Remove superfluous parentheses from PostgresExplainLexer (<a href="https://redirect.github.com/pygments/pygments/issues/3232">#3232</a>)</li> <li><a href="https://github.com/pygments/pygments/commit/9992e0992ad273565f19ffb1b4c9cae96cd8dd00"><code>9992e09</code></a> Merge pull request <a href="https://redirect.github.com/pygments/pygments/issues/3191">#3191</a> from jvoisin/dupes</li> <li><a href="https://github.com/pygments/pygments/commit/bd225771e856b79e8cb5b81533e1eba0cf9fbf85"><code>bd22577</code></a> Fix regexlint warnings after latest update.</li> <li><a href="https://github.com/pygments/pygments/commit/6a62df1d1fc77af7e9fc61325ef376297cadffbb"><code>6a62df1</code></a> Release preparation: Update the changelog.</li> <li><a href="https://github.com/pygments/pygments/commit/aabba32860b5ba15acabdcba9b436a32e92ce75e"><code>aabba32</code></a> Merge pull request <a href="https://redirect.github.com/pygments/pygments/issues/3221">#3221</a> from jvoisin/alter</li> <li><a href="https://github.com/pygments/pygments/commit/d3441d00a33467255b8b3ae9862f454e3aa58e3d"><code>d3441d0</code></a> Merge pull request <a href="https://redirect.github.com/pygments/pygments/issues/3225">#3225</a> from jvoisin/caddy</li> <li><a href="https://github.com/pygments/pygments/commit/c593f3f2f69e09670e58a121437a3c830a643071"><code>c593f3f</code></a> Add a lexer for Caddy</li> <li><a href="https://github.com/pygments/pygments/commit/0644b532c8df1dd67b26471871d432d100252a11"><code>0644b53</code></a> Simplify single-character regex alternations to character classes</li> <li>Additional commits viewable in <a href="https://github.com/pygments/pygments/compare/2.20.0...2.21.0">compare view</a></li> </ul> </details> <br /> Updates `uvicorn` from 0.52.3 to 0.52.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/Kludex/uvicorn/releases">uvicorn's releases</a>.</em></p> <blockquote> <h2>Version 0.52.4</h2> <h3>Fixed</h3> <ul> <li>Remove duplicate <code>Date</code> headers from accepted WebSocket handshakes with <code>websockets-sansio</code> (<a href="https://redirect.github.com/Kludex/uvicorn/pull/3078">#3078</a>)</li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/Kludex/uvicorn/compare/0.52.3...0.52.4">https://github.com/Kludex/uvicorn/compare/0.52.3...0.52.4</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md">uvicorn's changelog</a>.</em></p> <blockquote> <h2>0.52.4 (August 18, 2026)</h2> <h3>Fixed</h3> <ul> <li>Remove duplicate <code>Date</code> headers from accepted WebSocket handshakes with <code>websockets-sansio</code> (<a href="https://redirect.github.com/Kludex/uvicorn/pull/3078">#3078</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/Kludex/uvicorn/commit/8988c23704fc373c9206cca53ec57dd8ad7f44a5"><code>8988c23</code></a> Stabilize macOS Python 3.13 signal shutdown tests (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3084">#3084</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/898ddca9254b53c5bf7a6ee509756704caaa949f"><code>898ddca</code></a> Update PyPI publish action to version 1.14.2 (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3083">#3083</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/3869f8aac2bdd040fa3fbe564e1dad67e2637641"><code>3869f8a</code></a> Restore Mermaid diagram rendering (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3080">#3080</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/64148a9c574e1eb87d3d09b3ce4c256606f8d973"><code>64148a9</code></a> Version 0.52.4 (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3079">#3079</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/9e9e5691bd14d5c4cd66d9bd76c7730bc48461a2"><code>9e9e569</code></a> docs: correct release example PR number (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3072">#3072</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/b783dacab50b9d6767b0cf65826b2dc3aae21909"><code>b783dac</code></a> Remove duplicate Date header from SansIO WebSocket handshakes (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3078">#3078</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/27019b2a4b1fa6d68a289fcf7d738fbdc6ee4e5d"><code>27019b2</code></a> chore(deps): bump the python-packages group across 1 directory with 11 update...</li> <li><a href="https://github.com/Kludex/uvicorn/commit/1b6427311bb84a15addee688f6d41d96e33f8b0a"><code>1b64273</code></a> Fix a typo in index.md (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3006">#3006</a>)</li> <li>See full diff in <a href="https://github.com/Kludex/uvicorn/compare/0.52.3...0.52.4">compare view</a></li> </ul> </details> <br /> Updates `python-dotenv` from 1.2.2 to 1.2.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/theskumar/python-dotenv/releases">python-dotenv's releases</a>.</em></p> <blockquote> <h2>v1.2.3</h2> <h3>Fixed</h3> <ul> <li>Strip a leading UTF-8 BOM from <code>.env</code> file contents so the first variable is no longer silently lost when the file is saved with BOM (e.g. by some JetBrains IDEs on Windows) by [<a href="https://github.com/h1whelan"><code>@h1whelan</code></a>] in <a href="https://redirect.github.com/theskumar/python-dotenv/issues/640">#640</a></li> <li><code>set_key</code> now escapes backslashes, so values containing them (Windows paths, regular expressions) survive a write/read round-trip. Quoted values ending in an escaped backslash are no longer mis-parsed as an escaped quote, which used to swallow the following lines by [<a href="https://github.com/dchaudhari7177"><code>@dchaudhari7177</code></a>] in <a href="https://redirect.github.com/theskumar/python-dotenv/issues/680">#680</a></li> <li><code>dotenv run</code> now prints a friendly error instead of a traceback when no command is given by [<a href="https://github.com/bbc2"><code>@bbc2</code></a>] in <a href="https://redirect.github.com/theskumar/python-dotenv/issues/606">#606</a></li> <li>Cache the parsed result for empty <code>.env</code> files so repeated <code>dotenv_values</code>/<code>load_dotenv</code> calls no longer re-read the file by [<a href="https://github.com/ReinerBRO"><code>@ReinerBRO</code></a>] in <a href="https://redirect.github.com/theskumar/python-dotenv/issues/638">#638</a></li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/theskumar/python-dotenv/blob/main/CHANGELOG.md">python-dotenv's changelog</a>.</em></p> <blockquote> <h2>[1.2.3] - 2026-08-16</h2> <h3>Fixed</h3> <ul> <li>Strip a leading UTF-8 BOM from <code>.env</code> file contents so the first variable is no longer silently lost when the file is saved with BOM (e.g. by some JetBrains IDEs on Windows) by [<a href="https://github.com/h1whelan"><code>@h1whelan</code></a>] in <a href="https://redirect.github.com/theskumar/python-dotenv/issues/640">#640</a></li> <li><code>set_key</code> now escapes backslashes, so values containing them (Windows paths, regular expressions) survive a write/read round-trip. Quoted values ending in an escaped backslash are no longer mis-parsed as an escaped quote, which used to swallow the following lines by [<a href="https://github.com/dchaudhari7177"><code>@dchaudhari7177</code></a>] in <a href="https://redirect.github.com/theskumar/python-dotenv/issues/680">#680</a></li> <li><code>dotenv run</code> now prints a friendly error instead of a traceback when no command is given by [<a href="https://github.com/bbc2"><code>@bbc2</code></a>] in <a href="https://redirect.github.com/theskumar/python-dotenv/issues/606">#606</a></li> <li>Cache the parsed result for empty <code>.env</code> files so repeated <code>dotenv_values</code>/<code>load_dotenv</code> calls no longer re-read the file by [<a href="https://github.com/ReinerBRO"><code>@ReinerBRO</code></a>] in <a href="https://redirect.github.com/theskumar/python-dotenv/issues/638">#638</a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/theskumar/python-dotenv/commit/49515afee2d50c33cad9419b3800b3a0dc93fc59"><code>49515af</code></a> Bump version: 1.2.2 → 1.2.3</li> <li><a href="https://github.com/theskumar/python-dotenv/commit/8ac846ff2760b65470e769d7eed33e540f0934e1"><code>8ac846f</code></a> chore: add release runbook (RELEASING.md) and make release target</li> <li><a href="https://github.com/theskumar/python-dotenv/commit/bb31c944fb4b40e8dea59587f525840c38326166"><code>bb31c94</code></a> docs: add 1.2.3 release notes (<a href="https://redirect.github.com/theskumar/python-dotenv/issues/606">#606</a>, <a href="https://redirect.github.com/theskumar/python-dotenv/issues/638">#638</a>, <a href="https://redirect.github.com/theskumar/python-dotenv/issues/680">#680</a>)</li> <li><a href="https://github.com/theskumar/python-dotenv/commit/f7b18d9c72d1abcc2ad4023424b84f5bee30d266"><code>f7b18d9</code></a> fix: round-trip backslashes through set_key (<a href="https://redirect.github.com/theskumar/python-dotenv/issues/680">#680</a>)</li> <li><a href="https://github.com/theskumar/python-dotenv/commit/751f8c148222e58aa173c83c4e5e6cfccb2cc124"><code>751f8c1</code></a> ci(deps): bump actions/checkout from 6.0.2 to 6.0.3 in the github-actions gro...</li> <li><a href="https://github.com/theskumar/python-dotenv/commit/f1937b68f338d7ebd7754da377ca08b2f0df8dbb"><code>f1937b6</code></a> chore(deps): update mkdocs-include-markdown-plugin requirement from >=6.0.0 t...</li> <li><a href="https://github.com/theskumar/python-dotenv/commit/45b93720dd5e9e127d0be3971a04855d34e464d8"><code>45b9372</code></a> chore(deps): update pytest requirement from >=3.9 to >=9.0.3 (<a href="https://redirect.github.com/theskumar/python-dotenv/issues/653">#653</a>)</li> <li><a href="https://github.com/theskumar/python-dotenv/commit/72896e9244d2a1ff8d5e1934d3df8a35c813799a"><code>72896e9</code></a> docs: fix broken mkdocs link in CONTRIBUTING.md (<a href="https://redirect.github.com/theskumar/python-dotenv/issues/636">#636</a>)</li> <li><a href="https://github.com/theskumar/python-dotenv/commit/72754a16a4743e4c92edf87ce59ba0e4ff78758d"><code>72754a1</code></a> ci(deps): bump peaceiris/actions-gh-pages from 4.0.0 to 4.1.0 in the github-a...</li> <li><a href="https://github.com/theskumar/python-dotenv/commit/078325e92558330e9addc661b789c7b6123fa73c"><code>078325e</code></a> ci(security): harden CI/CD supply chain with SHA pinning and least-privilege ...</li> <li>Additional commits viewable in <a href="https://github.com/theskumar/python-dotenv/compare/v1.2.2...v1.2.3">compare view</a></li> </ul> </details> <br /> Updates `google-api-python-client` from 2.198.0 to 2.199.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/googleapis/google-api-python-client/releases">google-api-python-client's releases</a>.</em></p> <blockquote> <h2>v2.199.0</h2> <h2><a href="https://github.com/googleapis/google-api-python-client/compare/v2.198.0...v2.199.0">2.199.0</a> (2026-08-20)</h2> <h3>Features</h3> <ul> <li><strong>accesscontextmanager:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/902cd298442117caddbe81d4cdf6352547e5ebf9">https://togithub.com/googleapis/google-api-python-client/commit/902cd298442117caddbe81d4cdf6352547e5ebf9</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>accesscontextmanager:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/afaf4fd47b727c33fd1a944d04f4a59b67821da4">https://togithub.com/googleapis/google-api-python-client/commit/afaf4fd47b727c33fd1a944d04f4a59b67821da4</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li> <li><strong>admin:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/6cde8833628a99665ff55584aba362a28fec5048">https://togithub.com/googleapis/google-api-python-client/commit/6cde8833628a99665ff55584aba362a28fec5048</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>agentregistry:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/9b1d99cdcf7c4f0ecc4b4ff485c67c08b02472fa">https://togithub.com/googleapis/google-api-python-client/commit/9b1d99cdcf7c4f0ecc4b4ff485c67c08b02472fa</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>aiplatform:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/11ebd1d4065691d097b7ed6a626c3056061efea0">https://togithub.com/googleapis/google-api-python-client/commit/11ebd1d4065691d097b7ed6a626c3056061efea0</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li> <li><strong>aiplatform:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/202447756c729b95d81cd6e36c2ad01d0e529854">https://togithub.com/googleapis/google-api-python-client/commit/202447756c729b95d81cd6e36c2ad01d0e529854</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>aiplatform:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/d33acf4353b2900d7edc8733640cf2341cba660a">https://togithub.com/googleapis/google-api-python-client/commit/d33acf4353b2900d7edc8733640cf2341cba660a</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5636e618395a7af950ddf0349e2c3459dba33533">5636e61</a>)</li> <li><strong>alloydb:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/a8fab1fb81930c8267b11aef2384bce76c6f0068">https://togithub.com/googleapis/google-api-python-client/commit/a8fab1fb81930c8267b11aef2384bce76c6f0068</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>alloydb:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/dcf16ca5d8e2b66a3db23a412e1e56d8a9096e2a">https://togithub.com/googleapis/google-api-python-client/commit/dcf16ca5d8e2b66a3db23a412e1e56d8a9096e2a</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li> <li><strong>analyticshub:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/17ef99fa72736546124c97910b3b1318992ccdbc">https://togithub.com/googleapis/google-api-python-client/commit/17ef99fa72736546124c97910b3b1318992ccdbc</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>androidenterprise:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/e97fb8ad3d62dbb723f4b332f7c00452cc33825a">https://togithub.com/googleapis/google-api-python-client/commit/e97fb8ad3d62dbb723f4b332f7c00452cc33825a</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>androidmanagement:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/96073c61dad69df63e3da8f8fb96082b1aad5c66">https://togithub.com/googleapis/google-api-python-client/commit/96073c61dad69df63e3da8f8fb96082b1aad5c66</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>androidpublisher:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/186734b25a3b026609d01fece0547795d33a84b8">https://togithub.com/googleapis/google-api-python-client/commit/186734b25a3b026609d01fece0547795d33a84b8</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5636e618395a7af950ddf0349e2c3459dba33533">5636e61</a>)</li> <li><strong>androidpublisher:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/24cda798f95f49894ceb5004fa84bf51435eff7c">https://togithub.com/googleapis/google-api-python-client/commit/24cda798f95f49894ceb5004fa84bf51435eff7c</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li> <li><strong>androidpublisher:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/88bcd1c6f08c65a9b2b0de7ac02ac88c79811b38">https://togithub.com/googleapis/google-api-python-client/commit/88bcd1c6f08c65a9b2b0de7ac02ac88c79811b38</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>apigee:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/9636e977115e0667eda725cf71dd176ddbead6d4">https://togithub.com/googleapis/google-api-python-client/commit/9636e977115e0667eda725cf71dd176ddbead6d4</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5636e618395a7af950ddf0349e2c3459dba33533">5636e61</a>)</li> <li><strong>apigee:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/ee13aa4fe890a298d48532b319c3c34a5c9cb051">https://togithub.com/googleapis/google-api-python-client/commit/ee13aa4fe890a298d48532b319c3c34a5c9cb051</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li> <li><strong>apihub:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/f08679562db776eca7dfec1277e72adca625ac90">https://togithub.com/googleapis/google-api-python-client/commit/f08679562db776eca7dfec1277e72adca625ac90</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>apikeys:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/212766b05def99a351b9c3690ae86b436a24d01c">https://togithub.com/googleapis/google-api-python-client/commit/212766b05def99a351b9c3690ae86b436a24d01c</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>appengine:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/4e6761a60132b51f74aad70dfd1eb0a6ea83e2d4">https://togithub.com/googleapis/google-api-python-client/commit/4e6761a60132b51f74aad70dfd1eb0a6ea83e2d4</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>artifactregistry:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/893163c920c217454775c2e8caa5cf5350ce06bc">https://togithub.com/googleapis/google-api-python-client/commit/893163c920c217454775c2e8caa5cf5350ce06bc</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>assuredworkloads:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/4e70ca7de7f56118da25ee956fef1106f3bfde77">https://togithub.com/googleapis/google-api-python-client/commit/4e70ca7de7f56118da25ee956fef1106f3bfde77</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>assuredworkloads:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/9f7839bf55755e0a5caa5d7da411402cbc6362d9">https://togithub.com/googleapis/google-api-python-client/commit/9f7839bf55755e0a5caa5d7da411402cbc6362d9</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5636e618395a7af950ddf0349e2c3459dba33533">5636e61</a>)</li> <li><strong>authorizedbuyersmarketplace:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/0f80196c6e289da777ce1d9b408b6389d01ec678">https://togithub.com/googleapis/google-api-python-client/commit/0f80196c6e289da777ce1d9b408b6389d01ec678</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li> <li><strong>authorizedbuyersmarketplace:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/db313413c765ea7b91f38b671179a35343e73e9b">https://togithub.com/googleapis/google-api-python-client/commit/db313413c765ea7b91f38b671179a35343e73e9b</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>backupdr:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/f5233ef58b6cf1993a986a8ccb3b1c2884fb5222">https://togithub.com/googleapis/google-api-python-client/commit/f5233ef58b6cf1993a986a8ccb3b1c2884fb5222</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>batch:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/0007c340fb2333c084e967156fa8e2321a4615ef">https://togithub.com/googleapis/google-api-python-client/commit/0007c340fb2333c084e967156fa8e2321a4615ef</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>beyondcorp:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/55d13ccbd632ef78842cb4701d30af362aed59ed">https://togithub.com/googleapis/google-api-python-client/commit/55d13ccbd632ef78842cb4701d30af362aed59ed</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>biglake:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/fa81a9fbd72714f6e9cb7978235bfa4f63556889">https://togithub.com/googleapis/google-api-python-client/commit/fa81a9fbd72714f6e9cb7978235bfa4f63556889</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>bigqueryconnection:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/eca8f066a5e6f1cfb6e020c62fc84b6907fe2a5d">https://togithub.com/googleapis/google-api-python-client/commit/eca8f066a5e6f1cfb6e020c62fc84b6907fe2a5d</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>bigquerydatatransfer:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/220cfd714e1d9ce6502addf039b1eb768350f38a">https://togithub.com/googleapis/google-api-python-client/commit/220cfd714e1d9ce6502addf039b1eb768350f38a</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li> <li><strong>bigqueryreservation:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/1c2fda49c8217f79111c31a996b26a6db06d468a">https://togithub.com/googleapis/google-api-python-client/commit/1c2fda49c8217f79111c31a996b26a6db06d468a</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li> <li><strong>bigqueryreservation:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/5fd7f7e168980371272a5eb80809e1dc9e1c06fe">https://togithub.com/googleapis/google-api-python-client/commit/5fd7f7e168980371272a5eb80809e1dc9e1c06fe</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>bigquery:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/02a221cf2c8e518f2107ac328f583f7396f4c2b3">https://togithub.com/googleapis/google-api-python-client/commit/02a221cf2c8e518f2107ac328f583f7396f4c2b3</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>bigquery:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/dc3d306ce2139fe7173f17cc6d5286d12981da15">https://togithub.com/googleapis/google-api-python-client/commit/dc3d306ce2139fe7173f17cc6d5286d12981da15</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li> <li><strong>bigtableadmin:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/ba1d4ca677893c457a46d62515ab3271f74db5a4">https://togithub.com/googleapis/google-api-python-client/commit/ba1d4ca677893c457a46d62515ab3271f74db5a4</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>bigtableadmin:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/c58c670814614f549ff8c8d7b2affd1c33965ad8">https://togithub.com/googleapis/google-api-python-client/commit/c58c670814614f549ff8c8d7b2affd1c33965ad8</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/499649978cbe0a66f7362348b0790f23674f7e03">4996499</a>)</li> <li><strong>calendar:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/f4885d0eda944de8d6a8712c4fc78b8d1b29c7ba">https://togithub.com/googleapis/google-api-python-client/commit/f4885d0eda944de8d6a8712c4fc78b8d1b29c7ba</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li> <li><strong>certificatemanager:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/11e53578ffaf28dfa97836dc63265d2fb6915ab5">https://togithub.com/googleapis/google-api-python-client/commit/11e53578ffaf28dfa97836dc63265d2fb6915ab5</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li> <li><strong>ces:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/6195a7b6ae8aec3b7b3ab47a330af7acf973a0af">https://togithub.com/googleapis/google-api-python-client/commit/6195a7b6ae8aec3b7b3ab47a330af7acf973a0af</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li> <li><strong>ces:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/6c0604ee3b8214caf807eb2e7a42952e41a91ced">https://togithub.com/googleapis/google-api-python-client/commit/6c0604ee3b8214caf807eb2e7a42952e41a91ced</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> <li><strong>chat:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/0e92eaf5dd691f58f44462f401fe93e89a11ce18">https://togithub.com/googleapis/google-api-python-client/commit/0e92eaf5dd691f58f44462f401fe93e89a11ce18</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li> <li><strong>chat:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/183f95c88ce3a70e5cdd6787457068d9f245f646">https://togithub.com/googleapis/google-api-python-client/commit/183f95c88ce3a70e5cdd6787457068d9f245f646</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5636e618395a7af950ddf0349e2c3459dba33533">5636e61</a>)</li> <li><strong>chat:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/bf1e1f4ce0e2df50eeac19b34bee0fb5922cff50">https://togithub.com/googleapis/google-api-python-client/commit/bf1e1f4ce0e2df50eeac19b34bee0fb5922cff50</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/googleapis/google-api-python-client/commit/b0089df6768a806c3d837f71b5ba7eca79934e5a"><code>b0089df</code></a> chore(main): release 2.199.0 (<a href="https://redirect.github.com/googleapis/google-api-python-client/issues/2774">#2774</a>)</li> <li><a href="https://github.com/googleapis/google-api-python-client/commit/7b8de0bf590213897faf3092e64052ebfad04ffc"><code>7b8de0b</code></a> fix: drop support for Python 3.7-3.9 (<a href="https://redirect.github.com/googleapis/google-api-python-cli…
…(BDMS-974/1178) (#866) BDMS-974/1178: Expand actively_monitored_wells to include wells from all groups ### Why - actively_monitored_wells filtered wells with WHERE lower(trim(g.name)) = 'water level network' — a string match on a group's display name, restricting the layer to one group even though its name implies all actively monitored wells. - If that group were ever renamed, the filter would stop matching and the layer would silently return zero rows with no error (Section 4.3, R3). - A separate proposal to rename this layer to water_level_network_wells was withdrawn — the name was fine, the filter was just too narrow. ### How - New Alembic migration (986e0eb85ab3) drops and recreates both ogc_actively_monitored_wells and its internal mirror ogc_internal_actively_monitored_wells, removing the group-name predicate. The status_value = 'Currently monitored' filter is untouched — that's the real definition of "actively monitored." - Verified against production data first: confirmed via a real query that no currently-monitored well has zero group memberships, so the existing inner-join structure is safe as-is (no need to switch to a LEFT JOIN). - Wells belonging to multiple groups are aggregated into one row (group_ids/group_names/group_types as parallel arrays) rather than one row per group, so id stays unique for pygeoapi's id_field: id lookups — verified live that duplicate rows silently broke /items/{id}. - Deduplicates group_thing_association rows first (no unique constraint exists on that table) and orders all three arrays by group_id, so they stay correctly aligned with each other rather than each being sorted independently. - Added a test (test_ogc_actively_monitored_wells_includes_wells_from_other_groups) proving a well in a group other than Water Level Network now shows up. - Rewrote the A4/A6 scenarios in ogc-cleanup-sprint1.feature, dropping the old rename/deprecation-header scenarios and the stale hardcoded "322" feature-count assertion (never matched real data in any environment we checked). ### Notes - Found and separately flagged (not fixed here): a duplicate group row in prod, "water Level Network" (lowercase w) vs "Water Level Network", holding one stray well (WL-0428). Worth a data-cleanup follow-up. --------- Co-authored-by: likithabommasani21 <275146718+likithabommasani21@users.noreply.github.com>
BDMS-974 drops the "group name = 'water level network'" predicate from ogc_actively_monitored_wells, so the layer now covers currently-monitored wells in any group. The published prose still described the old filter and would have shipped wrong the moment that migration ran. The collection description now keys the layer on the monitoring status alone, and says what the join actually produces: a well in several groups appears once per group. That last point matters enough to repeat at field level -- the id column is no longer unique within the collection, which is the kind of thing a client discovers by having its keyed-by-id map silently drop rows. group_name loses its claim that it is always the Water Level Network. Keywords drop water-level-network for monitoring-status. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
/ogcapi/collections/waterlevels/instances returned a 500:
TypeError: 'NotImplementedError' object is not iterable
pygeoapi calls p.instances() and p.instance(id); this provider spelled
them get_instances() and get_instance(). Because BaseEDRProvider
*returns* a NotImplementedError instance from both rather than raising
one, the mismatch was silent -- /instances iterated that object, and
/instances/{id}/... validated the id against a truthy object, so any
identifier at all was accepted. Transducer deployments have therefore
never been reachable as EDR instances, which is exactly what the
waterlevels description advertises. Renamed; nothing called the old
names.
The behave feature that covers this has existed since ADR3 and caught it
on the first run, but it is tagged @backend @edr with no @production, and
CI runs "@backend and @production and not @Skip" -- so it has never run
there. Tagged @production.
Two fixture defects were hiding behind that, both of which made the
chemistry scenarios fail once the feature ran:
* The fixture seeded chemistry as observation rows, but d9e0f1a2b3c4
rebuilt ogc_water_chemistry over the legacy NMA_* tables, so the
collection saw nothing -- a 400 (pH is not a known parameter) and a
204. It now seeds NMA_Chemistry_SampleInfo/NMA_FieldParameters and
refreshes the materialized view, without which the rows stay invisible
anyway.
* ogc_water_chemistry gates on the thing's release_status as well as the
sample's, and wells seed as 'draft', so the fixture published no
chemistry at all. It now promotes its own well to public.
Full production behave suite: 85 scenarios, 0 failed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
ogc_waterlevels filtered on the reading's own release_status only, so a well whose own release_status was 'draft' or 'private' still published its public readings through OGC API - EDR -- with the well's name and coordinates attached to every one of them. ogc_water_chemistry has required the parent thing to be public since d9e0f1a2b3c4; this brings water levels onto the same rule, which is what made the inconsistency visible in the first place. ogc_internal_waterlevels is deliberately untouched. It carries non-public records by design for authenticated staff clients, exactly as ogc_internal_water_chemistry does. Downgrade restores the definition by importing z9a0b1c2d3e4 rather than copying its SQL, so the reverted view cannot drift from the definition of record -- the same approach b7c8d9e0f1a2 took. No rows change on the dev database: it has no non-public well carrying readings today, so this closes the hole rather than retracting published data. Whether that also holds in production is worth checking before deploy. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Serves downloadable connection and layer files from /gis so a desktop GIS user reaches our OGC API - Features collections without configuring a connection by hand. Two levels per client: a connections file that registers the whole service in one import, and six curated layer files carrying symbology, field aliases, value maps and scale visibility. Generated rather than committed because every artifact embeds an absolute service URL, and there are three environments times two mounts. Static files would mean six copies of each, all going stale as collections are added -- production already advertises 30 against the 13 defined in core/pygeoapi.py. The base URL comes from _server_url(), the same value pygeoapi stamps into its own self/next links, so a client that imports a connection and then pages through items never crosses hosts. Aliases and value maps derive from core/ogc-field-descriptions.yml, the file that already feeds /schema and /queryables, so a renamed field cannot drift between the API and the shipped layer files. Value maps are emitted only where the label differs from the stored value: the lexicon columns store terms that already read as prose, and mapping them to themselves would add kilobytes of noise per layer. trend_category is the real case -- "increasing" means the water table is falling. _defaults in that file is a shared pool, not a set of universal columns; it carries well and geothermal fields side by side and describe_fields only applies the ones a view reflects. collection_fields() does the same intersection here, because unfiltered a nine-column collection ships aliases for 42 fields. QGIS drops what it cannot match; ArcGIS Pro would not. No artifact embeds a credential. Both formats allow it -- QGIS connections have username/password attributes, CIMInternetServerConnection has a user field -- but internal access uses per-user API keys so they can be revoked per user, and a shared file carrying one person's key defeats that. The two EDR collections are excluded: they publish no /items endpoint and neither client has an EDR reader, so such a layer file would not open. The curated water-level layers use the feature collections carrying the same measurements summarised per site. The ArcGIS .ogc connection file is NOT generated. Esri documents where Pro writes it but not what is in it, and it is absent from the CIM spec, so /gis gives the two-step click path instead of shipping a guess that fails in the one client we cannot test against. Verification: the .qlr format was established by loading every curated layer into a real QGIS 4.0.1 against live production -- all six load valid on the OAPIF provider, serve live features and apply renderer, aliases, value map and scale. Two findings are pinned by tests: a flattened value map segfaults QGIS rather than erroring, and a curated layer must name a collection this branch serves (the first draft of the water-level layer named one only production has). The .lyrx files follow Esri's published CIM spec but have not been opened in Pro; none is available here. uv run pytest --ignore=tests/transfers -> 1140 passed, 84 skipped, 6 xpassed Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The four download routes carried response_class=PlainTextResponse, chosen for convenience rather than accuracy. Each returns a raw Response setting its own media_type, so OpenAPI advertised text/plain while the endpoint sent text/xml or application/json. Harmless to a client that ignores the schema, wrong for anything generating from it. Rather than restate the media type in the decorator, it now comes from the Response subclass in both places: XmlAttachment and JsonAttachment each declare `media_type`, FastAPI reads it off `response_class` to document the operation, and `_attachment` instantiates that same class. One definition, so the two cannot drift apart again. JsonAttachment deliberately subclasses Response rather than JSONResponse. The .lyrx body is already serialised, and re-encoding it would escape the whole CIM document into a JSON string. test_openapi_advertises_the_content_type_actually_returned compares the documented content type against the served one for all three download shapes; it fails on the previous code. uv run pytest --ignore=tests/transfers -> 1143 passed, 84 skipped, 6 xpassed Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
/gis returned HTML only, so a frontend wanting to offer these downloads had to hardcode the six curated layer ids and reconstruct their URLs. It now negotiates: HTML by default for a human following the link, JSON on ?f=json or an Accept: application/json header. Same precedence as api/disclaimer.py and pygeoapi, so the surfaces behave alike. The payload carries the service URL, the connection file, and per layer its id, title, abstract, backing collection, that collection's URL, geometry, renderer kind, and one download entry per client with href, media type and filename. Enough to build a download UI without knowing anything about this router. Hrefs are absolute and built from _app_base_url() rather than from the request: a browser app on another origin has to use them unchanged, and a proxy rewriting Host must not be able to redirect the caller. Tests fetch every advertised href and assert the media type and filename match what the download actually sends, so the catalogue cannot drift from the files. Also declares 404 on the two layer routes. Both already raised it for an unknown id, but only 422 was documented, so a generated client had no case for the error it is most likely to hit. uv run pytest --ignore=tests/transfers -> 1148 passed, 84 skipped, 6 xpassed Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The 11 thing-type layers carried construction and location detail but no signal of data recency: nothing distinguished a well measured last month from one last visited in 1994 without querying a second layer. This adds last_observation_date to the shared thing-view template -- the UTC date of the most recent observation recorded against the thing, or NULL where it has none -- and rebuilds all 11 public views and their ogc_internal_ counterparts from that one template so both mounts stay identical. Scope is the observation table, reached through the sample -> field_activity -> field_event chain every other observation-backed view here uses. Continuous transducer readings are deliberately excluded: they hang off deployments rather than field events, they exist for a handful of instrumented wells rather than for Group A generally, and a max() over the largest table in the schema would need an index of its own to stay cheap. Wells with logger data are served by actively_monitored_wells and the water-elevation layers. Per-thing lookup is a LEFT JOIN LATERAL so a paginated or single-feature request touches only the observations of the rows it returns. That join path had no indexes at all, so the four it needs come with the migration. The behave harness needed one fix to go with this: pygeoapi caches reflected table models process-wide, so the scenarios that downgrade the schema under a running app were building SELECTs naming a column the downgraded views no longer have. The cache is now cleared wherever those scenarios move the schema. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A well's construction record says how deep the hole goes and its water-level record says how far down the water sits, but nothing in the catalogue published the difference -- the standing column of water in the well, which is the number that says whether a well still holds usable water. ogc_well_water_column (and its unfiltered ogc_internal_ twin) carries one row per water well with the same well and location fields the water_wells layer publishes, plus four derived depths in feet: the well depth less the latest depth to water, less the mean depth to water, less the shallowest reading on record, and less the deepest. Shallowest water leaves the most in the well and deepest the least, hence maximum/minimum naming the column rather than the reading. Readings are manual groundwater-level observations taken below ground surface as value minus measuring-point height, the same convention water_well_summary and latest_depth_to_water_wells already use, so the three layers cannot disagree about what a depth to water is. Continuous transducer readings are not counted. Negative results are clamped to zero: a reading deeper than the recorded well depth is a contradiction between two records rather than a well holding negative water. The contradiction itself stays visible in water_well_summary, which publishes the raw shallowest and deepest readings beside the well depth. Wells with no recorded depth, or no usable reading, are left out -- all four columns would be NULL and the row would say nothing. Materialized, because every column but the latest aggregates a well's whole reading history. The nightly pg_cron job refreshes every matview in the public schema by name, so the two are picked up with no change to the schedule, and both carry a unique index on id so a manual refresh can run CONCURRENTLY. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…-column-layer feat(ogc): publish a well water-column layer
…to-staging-1.2.1 chore: merge production v1.2.1 into staging
…nches--staging--components--OcotilloAPI chore(staging): release 1.3.0-rc
Contributor
|
Your pull request is automatically being deployed to Dagster Cloud.
|
The repo's Procfile (`web: python3 -m transfers.transfer`) existed only so a Cloud Build trigger could buildpack-build the deprecated NM_Aquifer transfer driver into a deployed job. That build has been failing on every staging commit since 2026-08-21 and posts a red check on every PR, including release promotions. The transfer drivers are deprecated and run by hand for backfills; nothing should build or trigger them automatically. Remove the Procfile and say so in transfers/README.md. The Cloud Build trigger itself lives in GCP (nma-ocotillo-transfer, us-central1) and is deleted separately. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…-cloudbuild chore(transfers): drop the Procfile that fed the transfer build
Copilot stopped reviewing on behalf of
jirhiker due to an error
August 24, 2026 23:28
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Promotion of
stagingtoproductionfor the 1.3.0 stable release.Checkpoint: prerelease
v1.3.0-rc,cut from this same staging state.
Prerequisite already landed: #887 back-merged the
v1.2.1hotfix intostaging(the manualforward-mergestep from the hotfix flow had beenskipped), so
v1.2.1is instaginghistory and the staging manifest reads1.2.1.Merging this makes release-please open
chore(production): release 1.3.0;merging that tags
v1.3.0and deploys production.Post-deploy, by hand: registered data migrations have no CD path (CD runs
alembic only). This release includes
feat(data-migrations): publish existing project_areas.